임베디드 | 라즈베리파이 | ARM | 리눅스 | Qt | 딥러닝

raspberry pi 에 카메라 입력받는 방법은 여러개 있다.

1. CSI 단자를 이용하기

2. USB 포트를 이용하기

2-1) webcam

2-2) easycap 등 영상 캡쳐보드

 

마침 나에게 easycap 이 몇개 있다. 

 

 

 

 

 

1c88:0007 Somagic, Inc. SMI Grabber (EasyCAP DC60+ clone) [SMI-2021CBE]

 

 

ls /dev/video* 하니

video10~ video 23번까지나온다 

뭔 비디오가 이렇게 많은거지?

 

 

카메라는 

마침 적당한게 있어서 이 제품으로 진행

제품 정보 링크

https://gambia.desertcart.com/products/13039837-diysecuritycameraworld-700tvl-1-3-sony-super-had-ii-ccd-double-scan-360-degree-wide-angle-dome-indoor-cctv-security-camera-700-tv-lines-panoramic-360-degree-lens-osd-menu-advanced-dsp-to-offer-high-image-quality

https://www.ubuy.kr/en/product/1BBB63NC-180-360-panorama-view-angle-700tvl-1-3-super-had-ii-ccd-double-scan-indoor-outdoor-dome-security-cam?ref=hm-google-redirect

https://chepestdiscount.ru/product/321905426843   : 38달러

https://www.ubuy.kr/en/product/1BBB63NC-180-360-panorama-view-angle-700tvl-1-3-super-had-ii-ccd-double-scan-indoor-outdoor-dome-security-cam?srsltid=AfmBOorE9atzdXj5nXHqy6MeD_5Qn-BbOgYks5nMLSQTVyTchJS15RCu&ref=hm-google-redirect

https://simplespycameras.com/zosi-8ch-security-cameras-system8-channel-1080p-4-in-1-cctv-dvr-recorder-2tb-hard-drive-and-8-hd-2-0mp-1920tvl-weatherproof-bullet-and-dome-surveillance-cameras-with-120ft-65ft-night-vision/

https://www.ubuy.kr/en/product/1BBB63NC-180-360-panorama-view-angle-700tvl-1-3-super-had-ii-ccd-double-scan-indoor-outdoor-dome-security-cam?srsltid=AfmBOore_vVulRdumHzuW6RVzRmd97-_GCUTCx4y1l2nuCNVVLTYnn0t&ref=hm-google-redirect

https://diysecuritycameraworld.com/index.php?main_page=product_info&products_id=308&srsltid=AfmBOoojVapwGRCroHdn9sFgHzDbgr1_LhMRCiR4xbJlqan1Nco95FHC

https://dsccctv.com/index.php?main_page=product_info&products_id=198

https://www.amazon.com/Fisheye-Camera-Panorama-700TVL-Vandalproof/dp/B00N48ZDG6

 

 

 

음. 위에 첫번째 은색 케이스는 리눅스에서 video 값을 가져오지 못한다. easycap video DVR은 드라이버가 한번에 잡힌다.

 

이미지 캡쳐 체크

sudo apt install fswebcam
fswebcam -r 1280x720 --no-banner /home/pi/webcam_test.jpg

-r 1280x720: 해상도를 1280x720으로 설정

--no-banner: 이미지 하단의 기본 정보를 숨깁니다.

지원 해상도 체크

- v4l2-ctl --list-formats-ext

 

실시간 영상 확인

sudo apt install cheese

cheese

cheese cogl-warning warning과 error가 뜨면서 화면이 안나타 났다.

 

문제 해결

1. swap 용량 늘리기

free -h 해서 swap 용량 체크해봤다

swap 용량을 늘려준다.

sudo nano /etc/dphys-swapfile

# CONF_SWAPSIZE=100  <-- 이 부분을 찾습니다.

RAM 1GB 이하: 1024 (1GB) 이상
RAM 2GB: 1024 (1GB) 또는 2048 (2GB)
RAM 4GB 이상: 2048 (2GB) 또는 4096 (4GB)

sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start

또는

sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile

다시 체크

free -h

 

2. sudo usermod -a -G video $USER

video 권한 문제 

 

 

motion을 이용한 웹 스트리밍

sudo apt install motion

sudo nano /etc/motion/motion.conf

 

stream_localhost off (외부에서 접속 가능하도록)
stream_port 8081 (스트리밍 포트, 원하는 포트로 변경 가능)
daemon on (백그라운드에서 실행)
webcam_port 8080 (웹캠 포트, 보통 스트리밍 포트와 다르게 설정)

sudo nano /etc/default/motion 파일에서 start_motion_daemon=yes로 변경하여 부팅 시 자동으로 실행되도록 설정할 수도 있습니다.

sudo service motion start

 

에러

motion[2136]: [0:motion] [EMG] [ALL] motion_startup: Exit motion, cannot create log file /var/log/motion/motion.log: Permission denied

sudo service motion stop

motion -c /etc/motion/motion.conf

sudo motion -b

 

 

 sudo chmod 666 /var/log/motion/motion.log

 sudo chown motion /var/log/motion

sudo touch /var/log/motion.log
sudo chown motion:motion /var/log/motion.log

 

sudo service motion status

 

 

sudo mkdir /tmp/motion
sudo chown motion:motion /tmp/motion
sudo touch /tmp/motion/motion.log
sudo chown motion:motion /tmp/motion/motion.log

/etc/motion/motion.conf


 sudo chmod 666  /tmp/motion/motion.log

 sudo chown motion  /tmp/motion/motion.log

 

sudo service motion restart

 

sudo modprobe bcm2835-v4l2

 cat /var/log/motion/motion.log

 

sudo systemctl restart motion

sudo lsof -i -P -n | grep motion

 

방화벽 포트 열어주기 

 sudo apt-get install ufw

sudo ufw allow 8081

sudo ufw allow 8081/tcp

 

 

 

v4l2-ctl --list-devices

 

journalctl -u motion.service

motion -n -c /etc/motion/motion.conf

sudo truncate -s 0 /tmp/motion/motion.log

 

http://192.168.0.7:8080/

 

접속 됐다 결국 문제는

motion.log 파일 의 permission 문제와, 

motion.conf 값의 설정이다. 

인터넷이 느려서인지 지금 화면이 안나온다.

 

 

-----------------------------------------------------

sudo apt install python3-opencv

 

import cv2

# USB 웹캠 연결 (일반적으로 첫 번째 웹캠은 0)
cap = cv2.VideoCapture(0)

# 웹캠이 제대로 열렸는지 확인
if not cap.isOpened():
    print("Error: Could not open video device.")
    exit()

# 해상도 설정 (선택 사항, 웹캠이 지원하는 해상도 확인 필요)
# cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
# cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

while True:
    ret, frame = cap.read() # 프레임 읽기

    if not ret:
        print("Error: Failed to grab frame.")
        break

    cv2.imshow('USB Camera Feed', frame) # 프레임 화면에 표시

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

# 자원 해제
cap.release()
cv2.destroyAllWindows()

 

python3 test.py

 

 

video0 사용 중인거 체크하고 끄기

sudo lsof /dev/video0

sudo kill -9 <PID>

 

module 언로드

sudo modprobe -r uvcvideo

sudo modprobe uvcvideo

 

lsmod | grep uvcvideo

modinfo uvcvideo

 

활성화 여부 체크 

vcgencmd get_camera 

 

usbtv007 칩셋은 

lsmod | grep usbtv

 

커널에 빌트인된 드라이버 확인방법

dmesg | grep -i "video"
dmesg | grep -i "v4l" # Video4Linux 관련

 

zcat /proc/config.gz | grep "CONFIG_VIDEO_USBTV"

grep "CONFIG_VIDEO_USBTV" /boot/config-$(uname -r)

CONFIG_VIDEO_USBTV=y가 출력된다면, 드라이버는 커널에 빌트인된 상태

 

ls -l /sys/class/video4linux/video0/device/driver

 

usb 뺏다가 꽂으니까  (Device or resource busy) 에러 해결

 

해상도 --------------------------------------------------

라즈베리파이 3의 처리 능력 및 출력 해상도
라즈베리파이 3는 Full HD (1920x1080) 해상도까지 출력이 가능

 

Fushicai USBTV007 Video Grabber (EasyCAP)의 해상도
Fushicai USBTV007 칩셋을 사용하는 EasyCAP은 아날로그 비디오를 디지털로 변환하는 장치입니다. 주로 DVD 레코딩 표준을 따르므로 지원하는 해상도는 다음과 같습니다:

PAL (유럽 표준): 720 x 576 픽셀 @ 25fps
NTSC (북미 표준): 720 x 480 픽셀 @ 30fps
이 EasyCAP 장치는 아날로그 신호를 디지털로 변환하는 것이기 때문에, 입력되는 아날로그 소스 (예: VHS, DVD 플레이어의 컴포지트 또는 S-Video 출력)의 품질과 해상도에 따라 실제 출력되는 화면의 화질이 결정됩니다.

 

dsc-pc011080 camera 
 1920x1080P

해상도 (Resolution):
AHD/TVI/CVI (아날로그 HD): 2.4MP (2.4 메가픽셀) 1080P
Analog (기존 아날로그): 2000TVL (TV 라인)

이 카메라는 1/2.8인치 SONY IMX322 CMOS 센서를 사용하며, 피쉬아이(Fisheye) 렌즈를 통해 넓은 시야각을 제공하는 특징을 가지고 있습니다. 또한, DIP 스위치를 통해 AHD, TVI, CVI, CVBS(기존 아날로그) 신호 출력을 전환할 수 있는 하이브리드 카메라입니다.

 

 

이렇게 로봇의 눈은 어안렌즈로 넓은 시야각을 확보 할 수 있게 되었다.

이제 ROS 2에 적용해보도록하자.