흔한 생활/잡다한 공부
ROS 파이썬 opencv 적용해보기
흔한 학생
2024. 11. 19. 16:31
로봇 경진대회에서 사용하기 위해 opencv를 처음 사용해보았는데
어떤 부분 위주로 사용했는지 기초부터 정리해봐야겠다.
그냥 파이썬에서 실행하는 것과 ROS에서 opencv를 사용하는 게 섞여있다.
이미지 불러오기
img = cv2.imread('test.jpg')
cv2.imshow('frame',img)
cv2.waitkey(0)
cv2.destroyAllWindows()
#혹은
while True:
keycode = cv2.waitKey(0)
if keycode == ord('x'):
break
비디오 불러오기
video = cv2.VideoCapture('test.mp4')
if not video.isOpened():
print("Video is unavailable :", filepath)
exit(0)
카메라에서 불러오기
video = cv2.VideoCapture(0)
while(1):
ret, frame = video.read()
frame = cv2.resize(frame, (0, 0), fx=0.4, fy=0.4)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
cv2.imshow('frame',frame)
cv2 형식으로 인식가능하도록 BGR로 바꾸기
생략한 코드가 많지만 설명하자면 카메라에서 ROS로 받아온 이미지를 처리할 수 있도록 CvBridge로 변환해야했다. 이미지를 구독하는 변수에서 부르는 콜백함수에서 변환하도록 처리했다.
ROS1 코드이기에 ROS2와는 다를 것이다.
from cv_bridge import CvBridge
~~~
init함수 아래에
~~~
self.bridge = CvBridge()
self.sub_img = rospy.Subscriber("/cam0/usb_cam0/image_raw/compressed", CompressedImage, self.compressed_callback)
def compressed_callback(self, msg): # 추가함
rgb_img = self.bridge.compressed_imgmsg_to_cv2(msg, "bgr8")
이미지 사이즈 변경하기
cv2.resize(img,(640,480))
흑백 변경
img_gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
HSV 색 공간으로 변경
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
hsv mask
특정 색상만 추출하기 위해 mask를 만들었다
cv2.inRange(이미지, lower경계 어레이, upper경계 어레이)
bitwise_and 는 마스크로 필터링해서 첫번째 이미지와 두 번째 이미지를 합침
bitwise_or xor not 등등이 있긴한데 and만 사용했음
hsv_mask = cv2.inRange(hsv_image,np.array([0,0,0]),np.array([180,255,46]))
result = cv2.bitwise_and(frame, frame, mask=hsv_mask)
ROI 분리하기
관심가는 영역만 체크하기 위해 영상에서 특정 영역만 추출해야 했다.
이미지를 인덱싱 하듯 잘라내면 되는데 [y:y+h,x:x+w] 로 가능했다.
def detect_black_line(self, rgb_image):
# ROI 정의
img_x = 140
img_y = 375
img_w = 360
img_h = 15
img_xy = (img_x, img_y)
img_xwyh = (img_x + img_w, img_y+img_h)
roi = rgb_image[img_y : img_y + img_h , img_x : img_x + img_w]
hsv_image = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
hsv_mask = cv.inRange(hsv_image,np.array([0,0,0]),np.array([180,255,46]))
result = cv.bitwise_and(frame, frame, mask=hsv_mask)
black_pixels = np.sum(hsv_mask == 255) # 마스크에서 검은색 픽셀 수
total_pixels = result.shape[0] * result.shape[1] # 전체 픽셀 수