Перейти к содержимому
Compvision.ru
Alex_grem

Работа с контурами

Recommended Posts

еще можете на точки поделить и попробовать что то типа

http://erionhasanbelliu.com/shape-matching-using-cauchy-schwarz-divergence/

код готовый есть, правда биндинги вроде только к матлабу и тянется какая то толстая библиотека.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Mat image = imread("image.jpg",0); попробуйте, и в серый переводить не нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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."

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сравниваю изображения при помощи моментов.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте! Хочу совета спросить!

На изображении есть окружность и необходимо ее найти (может даже несколько окружностей). Первоначально для этого использовалась функция 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. хочу поделиться небольшим опытом - алгорим изложенный в статье не будет работать в том случае если точки расположены симметричено и их четное количество (например вершины квадрата)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что то вроде этого должно работать (не проверял, набросал прямо сейчас):

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за ответ! Сделал немного по другому


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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Теперь проблемы с поиском контуров))

На белом фоне черная дуга окружности. На одной такой картинке находится один контур и вычисляетются параметры окружности. А на другой картинке тоже с дугой находится 3 окружности и все мимо!!!

Я думаю тут дело либо в порогах срабатывания детектора Кэнни или в параметрах поиска findContours. Еще не понятно зачем необходим вектор hierarchy при поиске контуров.

Как сделать так, что бы дуга определялась как один контур?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

hierarchy - означает вложенность контура.

Остальное можно вывести на изображение по стадиям и посмотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ещё прошу совета!

Проблема с синтаксисом. Найдены контуры, записаны в вектор. Из вектора нужно выкинуть лишние контуры (убрать контуры где точек менее 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". Программа ищет и рисует окружности на искомом изображении, если отключить рисование окружностей, то эта ошибка не возникает. Можно ли как то вылечить это?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Отвечу сам на свой вопрос)))

Насчет удаления ненужных мне контуров. Я выкрутился так:


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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Лучше наверное использовать contourArea.

например:

if(fabs(contourArea(Mat(ConturStorage))) > 500)

не помню зачем я ставил fabs, может там площадь зависит от направления обхода контура, не помню )

ЗЫ: потребление ресурсов можно посмотреть в диспетчере задач, или, лучше в Process Explorer.

или почитать тут: http://habrahabr.ru/post/82514/ и тут http://vld.codeplex.com/

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот это условие:


if(fabs(contourArea(Mat(ConturStorage))) > 500)

не дает компилироваться программе, поробовал без fabs, тоже не выходит

пока оставлю как до этого написал.

про потребление ресурсов посмотрю, спасибо большое!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот такой кусок кода приведен в качестве примера на сайте 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я поробовал использовать contourArea и у меня возник вопрос. Чем больше точек в контуре тем значение площади (поправьте меня если не прав) больше. ожет имеет смысл не отсекать лишнее, а собирать контуры из фрагментов.

Предположим дуга окружности определяется не как один контур а как несколько, скажем два отдельных контура. Можно ли их склеить? и как из множества различных найденных контуров найти именно эти части?

Хотя на моем искомом изображении только и есть две дуги окружности, но детектор кенни и поиск контуров иногда не считают их одним целым.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У квадрата всего 4 точки останется после аппроксимации.

А площадь может быть любой.

Склеить можно, контур - всего лишь вектор точек, перечисленных в определенном направлении.

Но склеить так как нужно - это надо хорошо постараться.

В случае окружности, можно по каждой дуге восстанавливать окружность, затем "приклеивать" к ней точки находящиеся на малом расстоянии от этой окружности. Затем отсеять совпадающие окружности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за ответ! Видимо это все мне предстоит проделать)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Добрый день!

Изучаю 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. Исходноеpost-6310-0-57432200-1359548890_thumb.jp

2. Детектор границ Кенниpost-6310-0-68256700-1359548840_thumb.pn

3. Поиск контураpost-6310-0-15818100-1359548849_thumb.pn

Буду премного благодарен Вам всем за помощь!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вы же на mask контуры рисуете, можно посмотреть что выводится?

Мелкие контуры можно не рисовать на маске, фильтровать по площади контура, которую можно вычислить функцией

contourArea см. пару постов выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Конечно...на mask у меня выводится это:

post-6310-0-28624500-1359567214_thumb.pn

Как видите...выводит он совсем не то, что бы мне хотелось, к сожалению...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вбивать сейчас лень, единственное что в голову приходит, может аппроксимацию надо делать?

см. ф-цию:

CvSeq* cvApproxPoly( const void* srcSeq, int headerSize, CvMemStorage* storage,
int method, double parameter,
int parameter2=0 ); [/code]

Еще попробуйте ключ CV_RETR_EXTERNAL вместо CV_RETR_LIST.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сделал попытку аппроксимации,но программка крашится на данной строке

// хранилище памяти

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

И в консоль выбрасывает:

post-6310-0-92944400-1359623623_thumb.pn

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Например если контуров на изображении не найдено, а Вы вызываете


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]

то это и вызывает ошибку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо Вам большое! Аппроксимация помогла в какой-то степени, но желаемого результата удалось добиться лишь "размыв" изображение после детектора границ Канни)).

post-6310-0-05304400-1360839639_thumb.pn

Теперь у меня вопрос по ContourArea()..

функция ContourArea() показывает, что площадь контуров равна -4. Я получил абсолютное значение и когда хочу отсеять мелкие контуры -

у меня он или рисует все контуры, либо не рисует ничего.. Все контуры рисуются, когда ContourArea = 4. И не рисуются ни маленькие, ни большие при любых других

значениях, независимо от того больше четырёх, либо меньше. Не могли бы Вы подсказать, что можно сделать в данной ситуации?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×