Android OpenCV Найти контуры
Мне нужно извлечь самый большой контур изображения.
Это код, который я использую в настоящее время. собрал несколько фрагментов онлайн
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Imgproc.findContours(outerBox, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
double maxArea = -1;
int maxAreaIdx = -1;
for (int idx = 0; idx < contours.size(); idx++) {
Mat contour = contours.get(idx);
double contourarea = Imgproc.contourArea(contour);
if (contourarea > maxArea) {
maxArea = contourarea;
maxAreaIdx = idx;
}
}
и, похоже, он работает. однако, я не совсем уверен, как идти отсюда.
Я попытался использовать Imgproc.floodFill
, но я не совсем уверен, как это сделать.
для этой функции требуется мачта Mat
того же размера, что и исходная Mat
+2 горизонтальная и +2 вертикальная.
Когда я запустил это на контуре contours.get(maxAreaIdx)
, это дало мне ошибку.
Код:
Mat mask = Mat.zeros(contour.rows() + 2, contour.cols() + 2, CvType.CV_8UC1);
int area = Imgproc.floodFill(contour, mask, new Point(0,0), new Scalar(255, 255, 255));
Ошибка:
11-18 19:07:49.406: E/cv::error()(3117): OpenCV Error: Unsupported format or combination of formats () in void cvFloodFill(CvArr*, CvPoint, CvScalar, CvScalar, CvScalar, CvConnectedComp*, int, CvArr*), file /home/oleg/sources/opencv/modules/imgproc/src/floodfill.cpp, line 621
Итак, в основном, мой вопрос: как я, найдя контур с наибольшей площадью, "выделить" его? Я хочу, чтобы все остальное было черным, а контур был белым.
Спасибо!
Ответы
Ответ 1
Вы можете использовать функцию DrawContours в OpenCV: http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=drawcontours#drawcontours
Или вы можете использовать эту реализацию в С++ (вы можете найти эквивалент в Java в документе OpenCV, просто введите OpenCV + имя функции в google)
Mat src = imread("your image"); int row = src.rows; int col = src.cols;
//Create contour
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
Mat src_copy = src.clone();
findContours( src_copy, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);
// Create Mask
Mat_<uchar> mask(row,col);
for (int j=0; j<row; j++)
for (int i=0; i<col; i++)
{
if ( pointPolygonTest( contours[0], Point2f(i,j),false) =0)
{mask(j,i)=255;}
else
{mask(j,i)=0;}
};
попробуйте контуры [1], контуры [2]... чтобы найти самый большой
Это для отображения вашего контура:
namedWindow("Contour",CV_WINDOW_AUTOSIZE);
imshow("Contour", mask);