Jetson Nano Board 적용예제

Jetson Nano에서 OpenCV를 활용한 다양한 예제 프로그램을 소개합니다. 아래는 Jetson Nano에서 실행 가능한 간단한 프로그램 예제입니다.


1. 카메라 캡처 및 디스플레이

Jetson Nano의 CSI 카메라 또는 USB 카메라로 영상을 실시간으로 캡처하고 디스플레이하는 프로그램입니다.

코드:

import cv2

def main():
    cap = cv2.VideoCapture(0)  # 카메라 인덱스 (CSI 카메라 사용 시: 0)
    if not cap.isOpened():
        print("카메라를 열 수 없습니다.")
        return

    while True:
        ret, frame = cap.read()
        if not ret:
            print("프레임을 읽을 수 없습니다.")
            break

        cv2.imshow("Camera Feed", frame)

        # 'q'를 누르면 종료
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

2. 얼굴 인식

Haarcascade를 사용하여 Jetson Nano에서 카메라 입력으로 얼굴을 감지하는 예제입니다.

코드:

import cv2

def main():
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")

    cap = cv2.VideoCapture(0)
    if not cap.isOpened():
        print("카메라를 열 수 없습니다.")
        return

    while True:
        ret, frame = cap.read()
        if not ret:
            print("프레임을 읽을 수 없습니다.")
            break

        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 그레이스케일 변환
        faces = face_cascade.detectMultiScale(gray, 1.3, 5)  # 얼굴 탐지

        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)

        cv2.imshow("Face Detection", frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

3. 객체 추적 (HSV 색상 기반)

HSV 색상 공간을 사용하여 특정 색상의 객체를 추적합니다.

코드:

import cv2
import numpy as np

def main():
    cap = cv2.VideoCapture(0)
    if not cap.isOpened():
        print("카메라를 열 수 없습니다.")
        return

    while True:
        ret, frame = cap.read()
        if not ret:
            print("프레임을 읽을 수 없습니다.")
            break

        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

        # 빨간색 범위 정의
        lower_red = np.array([0, 120, 70])
        upper_red = np.array([10, 255, 255])
        mask = cv2.inRange(hsv, lower_red, upper_red)

        # 마스크를 원본 영상에 적용
        result = cv2.bitwise_and(frame, frame, mask=mask)

        cv2.imshow("Original Frame", frame)
        cv2.imshow("Tracked Object", result)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

4. 엣지 검출

Canny 엣지 검출기를 사용하여 이미지의 가장자리만 표시하는 예제입니다.

코드:

import cv2

def main():
    image = cv2.imread("sample.jpg", cv2.IMREAD_GRAYSCALE)
    if image is None:
        print("이미지를 로드할 수 없습니다.")
        return

    edges = cv2.Canny(image, 100, 200)

    cv2.imshow("Original Image", image)
    cv2.imshow("Edge Detection", edges)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

5. 모션 감지

프레임 간 차이를 계산하여 움직임을 감지하는 프로그램입니다.

코드:

import cv2

def main():
    cap = cv2.VideoCapture(0)
    if not cap.isOpened():
        print("카메라를 열 수 없습니다.")
        return

    ret, frame1 = cap.read()
    ret, frame2 = cap.read()

    while ret:
        diff = cv2.absdiff(frame1, frame2)
        gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
        blur = cv2.GaussianBlur(gray, (5, 5), 0)
        _, thresh = cv2.threshold(blur, 20, 255, cv2.THRESH_BINARY)
        dilated = cv2.dilate(thresh, None, iterations=3)
        contours, _ = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

        for contour in contours:
            if cv2.contourArea(contour) < 500:
                continue
            x, y, w, h = cv2.boundingRect(contour)
            cv2.rectangle(frame1, (x, y), (x + w, y + h), (0, 255, 0), 2)

        cv2.imshow("Motion Detection", frame1)
        frame1 = frame2
        ret, frame2 = cap.read()

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

추가 팁

  • Jetson Nano에서 OpenCV 성능을 최적화하려면 CUDA를 활성화하고 GPU 가속을 활용해야 합니다.
  • 설치된 OpenCV가 CUDA를 지원하는지 확인하려면 아래 명령을 실행하세요:
    import cv2
    print(cv2.getBuildInformation())
    

이 코드를 Jetson Nano에서 실행합니다. 😊