[OpenCV] 자이카 카메라 활용

강형우·2022년 11월 21일
0

OpenCV

목록 보기
2/17

자이카 카메라 활용

카메라 활용 사례

  • 카메라로 차선 등을 찾아 자율주행 구현
    • 차선 찾아서 차선을 벗어나지 않고 주행하도록 만들기
    • 사람을 찾아서 사람을 피해 주행하도록 만들기
    • 앞차의 뒤꽁무니를 찾아서 앞차를 따라가도록(군집주행) 만들기
  • 카메라를 이용한 주변상황 인지
    • 전방 이동물체 인식 - 차량인지? 사람인지? 자전거인지? 등등
    • 전방 고정물체 인식 - 교통표지판, 신호등, 정지선, 횡단보도, 언덕 등등
  • 카메라 영상으로 자기위치 파악(Localization)
    • 앞에 펼쳐진 전경을 보고, 또는 지형지물을 보고
    • 지도 데이터와 비교하여 현재 차량의 위치를 유추

카메라 관련 노드와 토픽

  • /usb_cam 노드에서 발행하는
    • /usb_cam/image_raw 토픽과
    • /usb_cam/image_raw/compressed 토픽을 이용

카메라 토픽

  • /usb_cam/image_raw 토픽
    • 타입 = sensor_msgs/Image
    • 구성

카메라 기능 사용하려면

  • launch파일에서 "usb_cam" 노드를 실행
    • Pkg(패키지) = usb_cam
    • Type(소스파일) = usb_cam_node.cpp (/nodes폴더 아래에)

카메라 설정값 조정 (parameter 세팅)

  • 해상도 Resolution
    • 가로 x 세로 = 640 x 480
    • <param name="image_width" value="640" />
    • <param name="image_height" value="480" />
  • 노출도 Exposure
    • 조명 상황에 맞춰 조정
    • <param name="autoexposure" value="false" />
    • <param name="exposure" value="150" />
    • 웬만해선 autoexposure의 value값은 건들지 말고 너무 밝으면 exposure의 value값을 줄이고 어두우면 올리자.

패키지 생성

  • my_cam 패키지 만들기
    • $ catkin_create_pkg my_cam std_msgs rospy
  • 서브 폴더 만들기
    • /launch 폴더 만들기

카메라 영상 출력 프로그램 예시

  • 카메라 영상을 OpenCV로 처리하여 그 결과를 화면에 출력
#!/usr/bin/env python
# _*_ coding: utf-8 _*_

import  cv2
import rospy
import numpy as np

from sensor_msgs.msg import Image
from cv_bridge import CvBridge

OpenCV 사용 준비
numpy 사용 준비

bridge = CvBridge()
cv_image = np.empty(shape[0])

ROS에서 OpenCV를 편하게 사용하기 위한 CvBridge 사용 준비

def img_callback(data):
    global cv_image
    cv_image = bridge.imgmsg_to_cv2(data, "bgr8")

ROS에서 영상정보가 topic안에 msg가 담겨져 날아오는데 그것을 OpenCV가 사용할 수 있는 이미지로 바꿔주는 함수

rospy.init_node('cam_tune',anonymous=True)
rospy.Subscriber("/usb_cam/image_raw",Image,img_callback)

while not rospy.is_shutdown():
    if cv_image.size != (640*480*3):
        continue

Image 토픽이 오면 callback 함수가 호출되도록 세팅
640x480 이미지 한 장이 모일 때까지 잠시 기다린다

  • 카메라 영상을 OpenCV로 처리하여 그 결과를 화면에 출력

gray = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)

원본 이미지를 그레이칼라로 변경

blur_gray = cv2.GaussianBlur(gray,(5,5),0)

부드럽게 변경

edge_img = cv2.Canny(np.uint8(blur_gray),60,70)

이미지의 외곽선만 표시하게 변경

cv2.imshow("original",cv_image)
cv2.imshow("gray",gray)
cv2.imshow("gaussian blur",blur_gray)
cv2.imshow("edge",edge_img)
cv2.waitKey(1)

원본포함 4개 이미지 표시

결과 확인

  • 다음 명령으로 실행
    $ roslaunch my_cam edge_cam.launch

    $ rqt_graph

자이카 ROS 토픽을 이용한 동영상 파일 제작

ROS 토픽의 저장

  • 카메라의 ROS 토픽을 저장했다가 나중에 다시 사용할 수 있다.
    • $ rosbag record -a

      날아다디는 모든 토픽을 저장, 멈추려면 'ctrl+c'

    • $ rosbag record rosout xycar_imu

      rosout, xycar_imu, 2개 토픽을 저장

    • $ rosbag record -O subset xycar_ultrasonic

      토픽을 subset.bag 파일로 저장

    • rosbag info subset.bag

      저장된 파일의 각종 정보를 보여줌

ROS 토픽의 재생

  • 저장한 ROS 토픽을 재생할 수 있다
    • $ rosbag play subset.bag

      저장했던 토픽을 재생함

    • $ rosbag play -r 2 subset.bag

      2배속으로 재생함

저장된 ROS bag 파일에서 카메라 토픽만 꺼내기

  • full_topic.bag 파일 안에는 모든 토픽이 담겨있다
    • 저장된 ROS bag 파일을 재생한다
      $ rosbag play full_topic.bag
    • 카메라 토픽만 골라서 저장한다, 파일 이름은 cam_topic.bag 으로 한다
      $ rosbag record -O cam_topic /usb_cam/image_raw/
    • 생성된 파일 확인
      $ rosbag info cam_topic.bag
    • 재생
      $ rosbag play cam_topic.bag
    • 토픽 확인
      $ rostopic list
      $ python edge_cam.py

카메라 토픽을 모아서 동영상 파일 만들기

  • 카메라 ROS토픽을 모아서 동영상 파일을 만들려면 다음 명령어로
    $ rosrun image_view video_recorder image:=' /usb_cam/image_raw'_filename:='track2.avi' _fps:=30
    $ rosbag play cam_topic.bag

0개의 댓글