ISP(with opencv) c++ #4

천동민·2023년 6월 6일
0

객체 검출하기
빨간색 표지판을 검출해서 사각형 그리기

빨간색 찾기

Mat src_HSV;
	cvtColor(src_color, src_HSV, COLOR_BGR2HSV);
	//detect shape

	//Red: h 150, 180
	int low_H = 150;
	int high_H = 180;
	int low_S = 0;
	int high_S = 255;
	int low_V = 100;
	int high_V = 255;

	Scalar lower_R(low_H, low_S, low_V);
	Scalar high_R(high_H, high_S, high_V);
	Mat detect_img_R;
	inRange(src_HSV, lower_R, high_R, detect_img_R);

위 코드를 이용해 빨간색을 찾아낸다
HSV영역을 이용하기 위해 cvtColor() 함수를 이용한다
detect_img_R라는 공간을 만들고 inRange() 함수를 이용해 이진화 이미지를 저장한다

그 다음 #3 게시물과 같이 윤곽선을 찾는다

vector<std::vector<cv::Point>> contours;
	vector<cv::Vec4i> hierarchy;
	findContours(detect_img_R, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

사각형 그리기 & center 표시

	int max_index = 0;
	double max_length = 0;
	for (size_t i = 0; i < contours.size(); i++)
	{
		double length = cv::arcLength(contours[i], false);
		double area = cv::contourArea(contours[i]);
		RotatedRect rt = cv::minAreaRect(contours[i]);
		if (contours[i].size() < 5) continue; // 픽셀 1개로는 원을 만들지 못하기 때문에 4개가 필요

		cv::rectangle(src_color, rt.boundingRect(), Scalar(255, 0, 255));		

		Point2f center(0, 0);
		float radius = 0;
		cv::minEnclosingCircle(contours[i], center, radius);
		cv::drawMarker(src_color, center, Scalar(0, 255, 255), MarkerTypes::MARKER_CROSS,140,2);
		int a=0;
	}	

minAreaRect() 함수를 통해 객체를 감싸는 최소의 사각형을 구한다

0개의 댓글