티스토리 뷰

로봇 경진대회에서 사용하기 위해 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]  # 전체 픽셀 수
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함