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

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

Recommended Posts

что за матрица 8х8? моменты вычисляются для контуров же

"Parameters:

C++: Moments moments(InputArray array, bool binaryImage=false )

array – Raster image (single-channel, 8-bit or floating-point 2D array) or an array ( or ) of 2D points (Point or Point2f ).

binaryImage – If it is true, all non-zero image pixels are treated as 1’s. The parameter is used for images only.

moments – Output moments."

Получается, в OpenCV для матрицы 8х8 нельзя посчитать момент? А что тогда это считает у меня данная функция?

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


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

ну видимо opencv воспринимает вашу матрицу 8х8 как изображение.

но непонятно какой вы в это вкладываете смысл.

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


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

ну видимо opencv воспринимает вашу матрицу 8х8 как изображение.

но непонятно какой вы в это вкладываете смысл.

Смысл в том, чтобы сравнивать блоки не при помощи метрики SSD или SAD. А вычислить моменты двух блоков, и сравнить их.

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


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

моменты Ху это не метрика для сравнения пикселей, а характеристики замнкнутых объектов представленных контуром.

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


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

моменты Ху это не метрика для сравнения пикселей, а характеристики замнкнутых объектов представленных контуром.

А зачем тогда есть возможность вычислять момент матрицы?

Может быть эта функция считает контур матрицы и находит именно момент этого контура?

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


Ссылка на сообщение
Поделиться на других сайтах
Raster image (single-channel, 8-bit or floating-point 2D array) or an array ( or ) of 2D points (Point or Point2f ).

all non-zero image pixels are treated as 1’s

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

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


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

Функция может искать моменты не только контуров, но и двоичных изображений:

Вот из хелпа:

void cvMoments(const CvArr* arr, CvMoments* moments, int binary=0)

Calculates all of the moments up to the third order of a polygon or rasterized shape.

Parameters:

* arr – Image (1-channel or 3-channel with COI set) or polygon (CvSeq of points or a vector of points)

* moments – Pointer to returned moment’s state structure

* binary – (For images only) If the flag is non-zero, all of the zero pixel values are treated as zeroes, and all of the others are treated as 1’s

The function cvMoments() calculates spatial and central moments up to the third order and writes them to moments. The moments may then be used then to calculate the gravity center of the shape, its area, main axises and various shape characeteristics including 7 Hu invariants.

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

Вот, получается данную матрицу 8х8 нужно бинаризовать? Содержит она значения пикселей яркости от 0 до 255

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


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

по любому там подразумевается фигура.

можно скармливать бинаризованное без флага.

можно скармливать не бинаризованное с флагом и функция интерпретирует как

функция воспринимает точки с нулевым значением как точки с нулевым значением, все остальные точки воспринимаются как 1.

единственное не знаю нужно ли чтобы контур был замкнут.

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


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

по любому там подразумевается фигура.

можно скармливать бинаризованное без флага.

можно скармливать не бинаризованное с флагом и функция интерпретирует как

единственное не знаю нужно ли чтобы контур был замкнут.

С другой стороны, вообще-то нигде не говорится, что это контуры. Ну это ж также, центр масс изображения и т.п. - моменты же это и обозначают. Матрица - это изображение. Мне кажется можно и использовать моменты для grayscale

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


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

хмм ну может быть, но это явно не стандартное применение.

http://en.wikipedia.org/wiki/Image_moment

Image moments are useful to describe objects after segmentation.

теоретически можно вообще взять все пиксели и в зависимости от их интенсивности домножить на коэффициент, но хз что получится.

Area (for binary images) or sum of grey level (for greytone images): M00

вроде бы определено даже.

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


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

сегментация через kmeans, возможно можно как то быстрее.

void segment_image(string name)

{

Mat src = imread( name.c_str(), 1 );

Mat samples(src.rows * src.cols, 3, CV_32F);

for( int y = 0; y < src.rows; y++ )

for( int x = 0; x < src.cols; x++ )

for( int z = 0; z < 3; z++)

samples.at<float>(y + x*src.rows, z) = src.at<Vec3b>(y,x)[z];

int clusterCount = 3;

Mat labels;

int attempts = 1;

Mat centers;

kmeans(samples, clusterCount, labels, TermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 0.0001, 10000), attempts, KMEANS_PP_CENTERS, centers );

Mat new_image( src.size(), src.type() );

for( int y = 0; y < src.rows; y++ )

for( int x = 0; x < src.cols; x++ )

{

int cluster_idx = labels.at<int>(y + x*src.rows,0);

new_image.at<Vec3b>(y,x)[0] = centers.at<float>(cluster_idx, 0);

new_image.at<Vec3b>(y,x)[1] = centers.at<float>(cluster_idx, 1);

new_image.at<Vec3b>(y,x)[2] = centers.at<float>(cluster_idx, 2);

}

imshow( "clustered image", new_image );

waitKey( 0 );

}

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


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

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

есть ли готовая функция, реализующая данную операцию? именно по форме.

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


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

контуры замкнутые?

контур на котором ищем похож на оригинал или его содержит?

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


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

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

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


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

контуры замкнутые?

контур на котором ищем похож на оригинал или его содержит?

в том и дело что контур не замкнут. на оригинальном изображении устанавливаю РОИ и выбираю самый длинный контур. потом надо на другой картинке найти его - же, но он больше, так как не обрезанный.

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


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

Нарисовать черный прямоугольник размером с кадр :)

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


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

ну вообщем лучше картинку покажите, а то я все равно не очень понял.

а так можете поискать curve matching и pairwise geometric histogram или просто Geometric Histograms

готового кода нету.

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


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

буду пробовать) По каринке: тот что оригинал - желтый. ну а требуется найти тот синий что справа.

post-5512-0-60284100-1336199711_thumb.jp

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


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

теоретически еще можно "пройтись" по большому контуру малым контуром(или разделить его на куски) и посмотреть корреляцию.

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


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

а по какому принципу делить, я так понял - синий, контур? на куски длинны, равные длинне желтого контура?

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


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

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

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

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

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


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

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

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


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

можно разделить контур на отрезки равной длины и представить контур как список углов(угол наклон отрезка от одной точки до другой).

возможно еще надо предварительно кривые сгладить.

потом через фурье преобразование сделать кросскорреляцию.

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


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

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

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


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

Хотел бы сравнить два изображения при помощи matchShapes


Mat image = imload("image.jpg");

Mat grey_scale = cvtColor(image,grey_scale,CV_RGB2GRAY);

matchShapes(grey_scale,grey_scale,CV_CONTOURS_MATCH_I1,0);

Получаю Unhandled exception А в описании написано:
double matchShapes(InputArray object1, InputArray object2, int method, double parameter=0 )

Parameters:	

object1 – First contour or grayscale image.

object2 – Second contour or grayscale image.

Если же указывать вместо Mat контуры, то все отлично. Посоветуйте, в чем может быть загвоздка?

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×