객체 검출하기
빨간색 표지판을 검출해서 사각형 그리기
빨간색 찾기
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() 함수를 통해 객체를 감싸는 최소의 사각형을 구한다