mrgloom 242 Жалоба Опубликовано May 5, 2012 еще можете на точки поделить и попробовать что то типа http://erionhasanbelliu.com/shape-matching-using-cauchy-schwarz-divergence/ код готовый есть, правда биндинги вроде только к матлабу и тянется какая то толстая библиотека. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 5, 2012 Mat image = imread("image.jpg",0); попробуйте, и в серый переводить не нужно. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
slicktail 1 Жалоба Опубликовано May 5, 2012 Mat image = imread("image.jpg",0); попробуйте, и в серый переводить не нужно. Вот ответ на мой вопрос: "Mat-s should be of type either CV_32SC2 or CV_32FC2 and have dimention 1xN or Nx1; this is because contour is a sequence of Points, i.e. a single row or a single column of X & Y pairs." Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
slicktail 1 Жалоба Опубликовано May 8, 2012 Сравниваю изображения при помощи моментов. 1.Черный квадрат 8х8 (все пиксели со значением 0) 2.Белый квадрат 8х8 (все пиксели со значением 255) 3.Черный квадрат 8х8 с белыми пикселями (пиксели со значением 0, немного 255 значений) На 1 больше всего похоже изображение 3. В этом можно убедиться, если сравнить попиксельно их (см моменты m00 - это и есть сумма пикселей). Как видно, моменты изображения 3 меньше моментов изображения 2. Но как только дело доходит до нормализованных моментов и моментов Ху, то на изображение 1 более похожим становится изображение 2, хотя это очевидно не так. Прошу совета, где здесь подводный камень. Моменты Черный квадрат 8х8 Белый квадрат 8х8 Черный квадрат 8х8 (немного белых пикселей) m00: 0.00000000000000000 m00: 16320.000000000000 m00: 66.000000000000000 m10: 0.00000000000000000 m10: 57120.000000000000 m10: 201.00000000000000 m01: 0.00000000000000000 m01: 57120.000000000000 m01: 66.000000000000000 m20: 0.00000000000000000 m20: 285600.00000000000 m20: 813.00000000000000 m11: 0.00000000000000000 m11: 199920.00000000000 m11: 201.00000000000000 m02: 0.00000000000000000 m02: 285600.00000000000 m02: 66.000000000000000 m30: 0.00000000000000000 m30: 1599360.0000000000 m30: 3747.0000000000000 m21: 0.00000000000000000 m21: 999600.00000000000 m21: 813.00000000000000 m12: 0.00000000000000000 m12: 999600.00000000000 m12: 201.00000000000000 m03: 0.00000000000000000 m03: 1599360.0000000000 m03: 66.000000000000000 mu20: 0.00000000000000000 mu20: 85680.000000000000 mu20: 200.86363636363637 mu11: 0.00000000000000000 mu11: 0.00000000000000000 mu11: 0.00000000000000000 mu02: 0.00000000000000000 mu02: 85680.000000000000 mu02: 0.00000000000000000 mu30: 0.00000000000000000 mu30: 0.00000000000000000 mu30: 47.603305785124121 mu21: 0.00000000000000000 mu21: 0.00000000000000000 mu21: 0.00000000000000000 mu12: 0.00000000000000000 mu12: 0.00000000000000000 mu12: 0.00000000000000000 mu03: 0.00000000000000000 mu03: 0.00000000000000000 mu03: 0.00000000000000000 nu20: 0.00000000000000000 nu20: 0.00032169117647058818 nu20: 0.046111945905334344 nu11: 0.00000000000000000 nu11: 0.00000000000000000 nu11: 0.00000000000000000 nu02: 0.00000000000000000 nu02: 0.00032169117647058818 nu02: 0.00000000000000000 nu30: 0.00000000000000000 nu30: 0.00000000000000000 nu30: 0.0013451703132773241 nu21: 0.00000000000000000 nu21: 0.00000000000000000 nu21: 0.00000000000000000 nu12: 0.00000000000000000 nu12: 0.00000000000000000 nu12: 0.00000000000000000 nu03: 0.00000000000000000 nu03: 0.00000000000000000 nu03: 0.00000000000000000 Моменты ХУ [0]: 0.00000000000000000 [0]: 0.00064338235294117635 [0]: 0.046111945905334344 [1]: 0.00000000000000000 [1]: 0.00000000000000000 [1]: 0.0021263115551764808 [2]: 0.00000000000000000 [2]: 0.00000000000000000 [2]: 1.8094831717226144e-006 [3]: 0.00000000000000000 [3]: 0.00000000000000000 [3]: 1.8094831717226144e-006 [4]: 0.00000000000000000 [4]: 0.00000000000000000 [4]: 3.2742293487473322e-012 [5]: 0.00000000000000000 [5]: 0.00000000000000000 [5]: 8.3438790131086014e-008 [6]: 0.00000000000000000 [6]: 0.00000000000000000 [6]: 0.00000000000000000 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано December 14, 2012 Хороший ресурс по работе с контурами: http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/contour_tracing_Abeer_George_Ghuneim/ Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Dvoetut 2 Жалоба Опубликовано January 15, 2013 Здравствуйте! Хочу совета спросить! На изображении есть окружность и необходимо ее найти (может даже несколько окружностей). Первоначально для этого использовалась функция HoughCircles. Но от ее использования было решено отказать потому, что поиск производился на изображении с камеры (в реальном времени). У функции куча параметров настроив которые можно добиться желаемого, но с большой натяжкой. Из-за шума камеры (видимо) положение найденной окружности сильно изменяется, в то время как оригинальное изображение находится на своем месте. Было принято решения производить поиск окружности следующим образом: 1) выделить на изображении контуры с помощью детектора Кэнни - в данном случае контур окружности или кусочек контура 2) найти на получившемся изображении контур с помощью функции findContours 3) найденный конутр (вектор с точками) прогнать по алгоритму изложенному тут http://www.dtcenter.org/met/users/docs/write_ups/circle_fit.pdf (уже тут где-то упоминалось). Ну а теперь сама проблема! При использовании findContours содается вектор: vector<vector<Point>> PreviosContur; Координаты точек в нем являются целыми числами. Для успешного вычисления параметров оркужности указанным алгоритмом необходимо использование чисел типа double int (или чего то такого). Иначе весь алгоритм работает коряво. Как мне полученный контур с координатами из целых чисел перегнать в числа с запятой? Или же можно сразу находить контур с координатами в этом формате? Использую библиотеку OpenCV 2.4.2 в MS Visual Studio 2008 P.S. хочу поделиться небольшим опытом - алгорим изложенный в статье не будет работать в том случае если точки расположены симметричено и их четное количество (например вершины квадрата) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано January 15, 2013 Что то вроде этого должно работать (не проверял, набросал прямо сейчас): vector<vector<Point>> PreviosContur; vector <vector<Point2d> > C; for(int i=0;i<PreviosContur.size();i++) { vector<Point2d> pts; for(int j=0;j<PreviosContur[i].size();j++) { pts.push_back(Point2d(PreviosContur[i][j].x,PreviosContur[i][j].y)); } C.push_back(pts); }[/code] можно еще через std::assign. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Dvoetut 2 Жалоба Опубликовано January 15, 2013 Спасибо за ответ! Сделал немного по другому vector<vector<Point>> PreviosContur; //контур с целыми числами vector<vector<Point2f>> UiViContur; //те же координаты только типа float for(int i=0;i<PreviosContur.size();i++) { vector <Point2f> VectBuf; for (int j=0; j<PreviosContur[i].size();j++) { VectBuf.push_back(cvPointTo32f(PreviosContur[i][j])); } UiViContur.push_back(VectBuf); } Нашел в справке C: CvPoint2D32f cvPointTo32f(CvPoint point) - converts CvPoint to CvPoint2D32f Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Dvoetut 2 Жалоба Опубликовано January 15, 2013 Теперь проблемы с поиском контуров)) На белом фоне черная дуга окружности. На одной такой картинке находится один контур и вычисляетются параметры окружности. А на другой картинке тоже с дугой находится 3 окружности и все мимо!!! Я думаю тут дело либо в порогах срабатывания детектора Кэнни или в параметрах поиска findContours. Еще не понятно зачем необходим вектор hierarchy при поиске контуров. Как сделать так, что бы дуга определялась как один контур? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано January 15, 2013 hierarchy - означает вложенность контура. Остальное можно вывести на изображение по стадиям и посмотреть. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Dvoetut 2 Жалоба Опубликовано January 28, 2013 Ещё прошу совета! Проблема с синтаксисом. Найдены контуры, записаны в вектор. Из вектора нужно выкинуть лишние контуры (убрать контуры где точек менее 100) Вот код: vector<vector<Point> > PreviosContur; vector<Vec4i> Hierarhy; cv::findContours(counturCanny,PreviosContur,Hierarhy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE,Point (0,0)); for (int i=0; i<PreviosContur.size();i++) { if (PreviosContur[i].size()<100) { PreviosContur.erase(i); i--; } } Вроде все логично, но компилятор ругается буквально так: error C2664: 'std::_Vector_iterator<_Ty,_Alloc> std::vector<_Ty>::erase(std::_Vector_const_iterator<_Ty,_Alloc>)' : cannot convert parameter 1 from 'int' to 'std::_Vector_const_iterator<_Ty,_Alloc>' with [ _Ty=std::vector, _Alloc=std::allocator> ] No constructor could take the source type, or constructor overload resolution was ambiguous Проблема видимо в обращении к элементу вектора. Подскажте пожалуйста! P.S. Ещё очень важный вопрос, не по этой ветке, но поиск по форуму ничем не помог. Программа компилируется нормально и в releas и в debug, однако, спусты некоторое время после начала работы вылетает ошибка "abnormal program termination". Программа ищет и рисует окружности на искомом изображении, если отключить рисование окружностей, то эта ошибка не возникает. Можно ли как то вылечить это? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Dvoetut 2 Жалоба Опубликовано January 29, 2013 Отвечу сам на свой вопрос))) Насчет удаления ненужных мне контуров. Я выкрутился так: vector<vector<Point> > ConturStorage; vector<Vec4i> Hierarhy; cv::findContours(counturCanny,ConturStorage,Hierarhy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE,Point (0,0)); //удалим маленькие контуры (короткие последовательности точек) vector<vector<Point> > PreviosContur; for (int i=0; i<ConturStorage.size();i++) { if (ConturStorage[i].size()>=200) { PreviosContur.push_back(ConturStorage[i]); } } ConturStorage.clear();//теперь очистим хранилище, что бы не загружать память Насчет последней строчки не уверен, но так мне спокойнее)) Случайно это или нет, но после введения этого кода программа перестала вылетать и все работает нормально. Но один раз появилась в консоли таккая строка (даже несколько строк): ERROR: SampleCB() - buffersozes do not match Как я понял это связано с конкретной камерой и на работу программы не влияет. Некоторое пояснение я нашёл тут http://tech.groups.yahoo.com/group/OpenCV/message/58461 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано January 29, 2013 Лучше наверное использовать contourArea. например: if(fabs(contourArea(Mat(ConturStorage))) > 500) не помню зачем я ставил fabs, может там площадь зависит от направления обхода контура, не помню ) ЗЫ: потребление ресурсов можно посмотреть в диспетчере задач, или, лучше в Process Explorer. или почитать тут: http://habrahabr.ru/post/82514/ и тут http://vld.codeplex.com/ Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Dvoetut 2 Жалоба Опубликовано January 29, 2013 Вот это условие: if(fabs(contourArea(Mat(ConturStorage))) > 500) не дает компилироваться программе, поробовал без fabs, тоже не выходит пока оставлю как до этого написал. про потребление ресурсов посмотрю, спасибо большое! Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано January 29, 2013 Вот такой кусок кода приведен в качестве примера на сайте opencv: vector<Point> contour; contour.push_back(Point2f(0, 0)); contour.push_back(Point2f(10, 0)); contour.push_back(Point2f(10, 10)); contour.push_back(Point2f(5, 4)); double area0 = contourArea(contour); vector<Point> approx; approxPolyDP(contour, approx, 5, true); double area1 = contourArea(approx); cout << "area0 =" << area0 << endl << "area1 =" << area1 << endl << "approx poly vertices" << approx.size() << endl;[/code] contourArea Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Dvoetut 2 Жалоба Опубликовано January 29, 2013 я поробовал использовать contourArea и у меня возник вопрос. Чем больше точек в контуре тем значение площади (поправьте меня если не прав) больше. ожет имеет смысл не отсекать лишнее, а собирать контуры из фрагментов. Предположим дуга окружности определяется не как один контур а как несколько, скажем два отдельных контура. Можно ли их склеить? и как из множества различных найденных контуров найти именно эти части? Хотя на моем искомом изображении только и есть две дуги окружности, но детектор кенни и поиск контуров иногда не считают их одним целым. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано January 29, 2013 У квадрата всего 4 точки останется после аппроксимации. А площадь может быть любой. Склеить можно, контур - всего лишь вектор точек, перечисленных в определенном направлении. Но склеить так как нужно - это надо хорошо постараться. В случае окружности, можно по каждой дуге восстанавливать окружность, затем "приклеивать" к ней точки находящиеся на малом расстоянии от этой окружности. Затем отсеять совпадающие окружности. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Dvoetut 2 Жалоба Опубликовано January 29, 2013 Спасибо за ответ! Видимо это все мне предстоит проделать))) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alexer 0 Жалоба Опубликовано January 30, 2013 Добрый день! Изучаю OpenCV очень недавно, но требуется решить задачу распознавания знаков ограничения скорости. Решил попробовать вариант сравнения с шаблоном, но у меня возникает проблема: сначала я использую детектор границ Canny и он довольно хорошо находит нужные мне окружности(рамка знака ограничения скорости). Но когда я по примеру для похожей задачи хочу выделить контуры и залить их белым(для маски, чтобы в последующем сравнить её с исходным изображением), контурами рамка обводится плохо и нет возможности сделать из неё маску. Подскажите, пожалуйста, что можно сделать в данной ситуации? И как можно было бы очистить изображение от мелких объектов? Идея такая - исходное изображение я конвертирую в HSV палитру и разбиваю на отдельные каналы. Для каждого канала есть свои ползунки, чтобы подобрать оптимальное значение( экспериментально и через статьи в интернете оптимальными явились Hue [170,255], Sat[100,255], Val[100,255]). Это параметры для красного цвета, чтобы в последующем выделить рамку знака. #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <cv.h> #include <highgui.h> #include <cxcore.h> IplImage* image = 0; IplImage* dst = 0; // для хранения каналов HSV IplImage* hsv = 0; IplImage* h_plane = 0; IplImage* s_plane = 0; IplImage* v_plane = 0; // для хранения каналов HSV после преобразования IplImage* h_range = 0; IplImage* s_range = 0; IplImage* v_range = 0; // для хранения суммарной картинки IplImage* hsv_and = 0; //Для хранения контуров IplImage* contoured=0; //Маска IplImage* mask=0; //Между кенни и контуром IplImage* cont=0; int Hmin = 0; int Hmax = 256; int Smin = 0; int Smax = 256; int Vmin = 0; int Vmax = 256; int HSVmax = 256; // // функции-обработчики ползунков // void myTrackbarHmin(int pos) { Hmin = pos; cvInRangeS(h_plane, cvScalar(Hmin), cvScalar(Hmax), h_range); } void myTrackbarHmax(int pos) { Hmax = pos; cvInRangeS(h_plane, cvScalar(Hmin), cvScalar(Hmax), h_range); } void myTrackbarSmin(int pos) { Smin = pos; cvInRangeS(s_plane, cvScalar(Smin), cvScalar(Smax), s_range); } void myTrackbarSmax(int pos) { Smax = pos; cvInRangeS(s_plane, cvScalar(Smin), cvScalar(Smax), s_range); } void myTrackbarVmin(int pos) { Vmin = pos; cvInRangeS(v_plane, cvScalar(Vmin), cvScalar(Vmax), v_range); } void myTrackbarVmax(int pos) { Vmax = pos; cvInRangeS(v_plane, cvScalar(Vmin), cvScalar(Vmax), v_range); } int main(int argc, char* argv[]) { image=cvLoadImage("D:\\1.jpg",1); //Создание картинок hsv=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,3); h_plane = cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1); s_plane = cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1); v_plane = cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1); h_range = cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1); s_range = cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1); v_range = cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1); hsv_and = cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1); contoured=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1); mask=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1); cont=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1); //Создание маски, заливка изображения чёрным cvSet(mask,cvScalar(0,0,0)); //Конвертируем в HSV cvCvtColor(image,hsv,CV_BGR2HSV); //Разбиваем на отдельные каналы cvCvtPixToPlane(hsv, h_plane,s_plane,v_plane,0); //определим max и min значение HSV каналов double framemin=0; double framemax=0; cvMinMaxLoc(h_plane,&framemin,&framemax); printf("[H] %f x %f\n",framemin,framemax); Hmin=framemin; Hmax=framemax; cvMinMaxLoc(s_plane,&framemin,&framemax); printf(" %f x %f\n",framemin,framemax); Smin=framemin; Smax=framemax; cvMinMaxLoc(v_plane,&framemin,&framemax); printf("[V] %f x %f\n",framemin,framemax); Vmin=framemin; Vmax=framemax; //Отображение изображений cvNamedWindow("original",CV_WINDOW_AUTOSIZE); cvNamedWindow("H range",CV_WINDOW_AUTOSIZE); cvNamedWindow("S range",CV_WINDOW_AUTOSIZE); cvNamedWindow("V range",CV_WINDOW_AUTOSIZE); cvNamedWindow("Contoured",CV_WINDOW_AUTOSIZE); cvNamedWindow("Mask",CV_WINDOW_AUTOSIZE); cvNamedWindow("Canny",CV_WINDOW_AUTOSIZE); cvCreateTrackbar("Hmin","H range", &Hmin, HSVmax, myTrackbarHmin); cvCreateTrackbar("Hmax","H range", &Hmax, HSVmax,myTrackbarHmax); cvCreateTrackbar("Smin","S range",&Smin,HSVmax,myTrackbarSmin); cvCreateTrackbar("Smax","S range",&Smax,HSVmax,myTrackbarSmax); cvCreateTrackbar("Vmin","V range",&Vmin,HSVmax,myTrackbarVmin); cvCreateTrackbar("Vmax","V range",&Vmax,HSVmax,myTrackbarVmax); while(1){ //отображаем изображение cvShowImage("original",image); cvShowImage("H range",h_range); cvShowImage("S range",s_range); cvShowImage("V range",v_range); //складываем cvAnd(h_range,s_range,hsv_and); cvAnd(hsv_and,v_range,hsv_and); //Выделение контура cvCanny(hsv_and,cont,50,255,5); // хранилище памяти CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* contours = 0; //Поиск контура cvFindContours(cont,storage,&contours,sizeof(CvContour),CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); // рисуем найденный контур НА маске и заливаем его белым cvDrawContours(mask,contours, CV_RGB(255,255,255),CV_RGB(255,255,255), 0, CV_FILLED, CV_AA, cvPoint(0,0)); cvShowImage("Canny",cont); cvShowImage("Contoured", hsv_and); cvShowImage("Mask", mask); char c=cvWaitKey(33); if (c==27){ break; } } // освобождаем ресурсы cvReleaseImage(&image); cvReleaseImage(&hsv); cvReleaseImage(&h_range); cvReleaseImage(&s_range); cvReleaseImage(&v_range); cvReleaseImage(&hsv_and); cvReleaseImage(&contoured); cvReleaseImage(&mask); cvReleaseImage(&cont); // удаляем окна cvDestroyAllWindows(); return 0; } Скриншоты исходного изображения, изображения после поиска границ Кенни и контура прилагаются. 1. Исходное 2. Детектор границ Кенни 3. Поиск контура Буду премного благодарен Вам всем за помощь! Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано January 30, 2013 Вы же на mask контуры рисуете, можно посмотреть что выводится? Мелкие контуры можно не рисовать на маске, фильтровать по площади контура, которую можно вычислить функцией contourArea см. пару постов выше. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alexer 0 Жалоба Опубликовано January 30, 2013 Конечно...на mask у меня выводится это: Как видите...выводит он совсем не то, что бы мне хотелось, к сожалению... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано January 30, 2013 Вбивать сейчас лень, единственное что в голову приходит, может аппроксимацию надо делать? см. ф-цию: CvSeq* cvApproxPoly( const void* srcSeq, int headerSize, CvMemStorage* storage, int method, double parameter, int parameter2=0 ); [/code] Еще попробуйте ключ CV_RETR_EXTERNAL вместо CV_RETR_LIST. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alexer 0 Жалоба Опубликовано January 31, 2013 Сделал попытку аппроксимации,но программка крашится на данной строке // хранилище памяти CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* contours = 0; //Поиск контура cvFindContours(cont,storage,&contours,sizeof(CvContour),CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); cvApproxPoly(contours,sizeof(CvContour),storage,CV_POLY_APPROX_DP,0.1,0); // рисуем найденный контур НА маске и заливаем его белым cvDrawContours(mask,contours, CV_RGB(255,255,255),CV_RGB(255,255,255), 0, CV_FILLED, CV_AA, cvPoint(0,0)); Скорее всего я просто не до конца понял, как правильно использовать данную функцию, пока пытаюсь найти примеры к ней.. А ругается дебаггер следующим образом: fatal error C1099: Edit and Continue engine terminating compile И в консоль выбрасывает: Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано February 1, 2013 Например если контуров на изображении не найдено, а Вы вызываете cvApproxPoly(contours,sizeof(CvContour),storage,CV_POLY_APPROX_DP,0.1,0); cvDrawContours(mask,contours, CV_RGB(255,255,255),CV_RGB(255,255,255), 0, CV_FILLED, CV_AA, cvPoint(0,0));[/code] то это и вызывает ошибку. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alexer 0 Жалоба Опубликовано February 14, 2013 Спасибо Вам большое! Аппроксимация помогла в какой-то степени, но желаемого результата удалось добиться лишь "размыв" изображение после детектора границ Канни)). Теперь у меня вопрос по ContourArea().. функция ContourArea() показывает, что площадь контуров равна -4. Я получил абсолютное значение и когда хочу отсеять мелкие контуры - у меня он или рисует все контуры, либо не рисует ничего.. Все контуры рисуются, когда ContourArea = 4. И не рисуются ни маленькие, ни большие при любых других значениях, независимо от того больше четырёх, либо меньше. Не могли бы Вы подсказать, что можно сделать в данной ситуации? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах