Я хочу нарисовать Rect вокруг обнаруженных canny ребер. У меня есть это изображение, которое является результатом обнаружения глаз, морфологических операций и canny edge.Рисовать Прямо вокруг точки canny edge
Я попытался с помощью контуров обвил его по прямоугольнику, но результат был не точен.
Как я могу получить что-то вроде этого изображения?
Я использую эту функцию, чтобы нарисовать контуры:
void find_contour(Mat image)
{
Mat src_mat, gray_mat, canny_mat;
Mat contour_mat;
Mat bounding_mat;
contour_mat = image.clone();
bounding_mat = image.clone();
cvtColor(image, gray_mat, CV_GRAY2BGR);
// apply canny edge detection
Canny(gray_mat, canny_mat, 30, 128, 3, false);
//3. Find & process the contours
//3.1 find contours on the edge image.
vector< vector< cv::Point> > contours;
findContours(canny_mat, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
//3.2 draw contours & property value on the source image.
int largest_area = 0;
int largest_contour_index = 0;
Rect bounding_rect;
for (size_t i = 0; i< contours.size(); i++) // iterate through each contour.
{
double area = contourArea(contours[i]); // Find the area of contour
if (area > largest_area)
{
largest_area = area;
largest_contour_index = i; //Store the index of largest contour
bounding_rect = boundingRect(contours[i]); // Find the bounding rectangle for biggest contour
}
}
drawContours(image, contours, largest_contour_index, Scalar(0, 255, 0), 2);
imshow("Bounding ", image);
}
ограничивающему прямоугольнику, созданный 'boundingRect()' "не точны"? Это правильно? Если вам нужна меньшая граница, вы можете попробовать 'cv :: minAreaRect()' для получения 'RotatedRect', который может быть меньше. Но ваш пример - это то, что вы получаете, если вы нарисуете 'bounding_rect', например. используя 'cv :: line()'. Не могли бы вы привести «неточный» пример и объяснить, где проблема? – Kellerspeicher
Этот http://postimg.org/image/ursfkojs5/ выводит boundRect, используя контуры, он не рисует, как я хочу, на изображении выше – musta
использовать 'cv :: rectangle (image, bounding_rect, cv :: Scalar (255,255,255))); 'перед имшоу. Но это будет делать только один (самый большой) ограничивающий прямоугольник контура, поэтому, если вы хотите ВСЕ, вам придется использовать вызов, который для каждого прямоугольника, а не только для самого большого контура. – Micka