Как бы я интегрировал функцию contourArea () в мою программу OpenCV?

Мой код предназначен для обнаружения различных фигур на основе количества вершин, которые у них есть. Я наконец достиг этого, и он отлично работает для простых изображений, как показано здесь: http://i.imgur.com/f9qvBwF.png Однако для этого молотого изображения: http://i.imgur.com/jhl0NUQ.png это создает сотни форм из-за всех маленьких пикселей. Теперь я знаю достаточно об OpenCV, чтобы знать, что есть размывание и расширение, но кажется, что лучшим подходом было бы исключить контуры, площадь которых ниже определенного количества пикселей, однако я не знаю, как интегрировать функцию contourArea () в мой код такой, чтобы он работал.
Вот мой текущий код:

#include "opencv2/core/core.hpp"#include "opencv2/flann/miniflann.hpp"#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/photo/photo.hpp"#include "opencv2/video/video.hpp"#include "opencv2/features2d/features2d.hpp"#include "opencv2/objdetect/objdetect.hpp"#include "opencv2/calib3d/calib3d.hpp"#include "opencv2/ml/ml.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/contrib/contrib.hpp"#include "opencv2/core/core_c.h"#include "opencv2/highgui/highgui_c.h"#include "opencv2/imgproc/imgproc_c.h"
using namespace cv;
using namespace std;

Mat img;
Mat img_gray;void contour_finder(int, void*);

int main(int argc, char *argv[])
{
img = imread("C:/Users/wyndr_000/Documents/VisualStudio2013/Projects/OpenCV_Template/OpenCV_Template/testpic.png", CV_LOAD_IMAGE_UNCHANGED);
cvtColor(img, img_gray, CV_RGB2GRAY);
contour_finder(0, 0);

waitKey();
}

void contour_finder(int, void*)
{
Mat img_thresh;
Mat drawn_contours;
threshold(img_gray, img_thresh, 183, 255, 2);
imshow("Thresh Image", img_thresh);

vector<vector<Point> > contours;
vector<Point> result;

findContours(img_thresh, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);

// Find a way to filter it out based on Area

for (size_t i = 0; i < contours.size(); i++){
approxPolyDP(Mat(contours[i]), result, arcLength(Mat(contours[i]), true)*0.02, true);

//  if (contourArea(result) < 49)
//{
if (result.size() == 3)
{
cout << "TRIANGLE\n";
}
else if (result.size() == 4)
{
cout << "QUADRILATERAL\n";
}
else if (result.size() == 5)
{
cout << "PENTAGON\n";
}
else if (result.size() == 6)
{
cout << "HEXAGON\n";
}
else if (result.size() == 10)
{
cout << "STAR\n";
}
else if (result.size() == 12)
{
cout << "PLUS-SIGN\n";
}
//  }
}/* drawn_contours = Mat::zeros(img_thresh.size(), CV_8UC3);
for (int i = 0; i< contours.size(); i++)
{
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
drawContours(drawn_contours, contours, i, color, 2, 8, hierarchy, 0, Point());
}
namedWindow("Contours", CV_WINDOW_AUTOSIZE);
imshow("Contours", drawn_contours); */
}

Вы заметите, где я объявляю, на что указывают различные количества вершин, у меня есть закомментированная функция contourArea, потому что именно там я и предполагал, что это пойдет.

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector