slicktail 1 Жалоба Опубликовано April 3, 2012 что за матрица 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 нельзя посчитать момент? А что тогда это считает у меня данная функция? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 3, 2012 ну видимо opencv воспринимает вашу матрицу 8х8 как изображение. но непонятно какой вы в это вкладываете смысл. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
slicktail 1 Жалоба Опубликовано April 3, 2012 ну видимо opencv воспринимает вашу матрицу 8х8 как изображение. но непонятно какой вы в это вкладываете смысл. Смысл в том, чтобы сравнивать блоки не при помощи метрики SSD или SAD. А вычислить моменты двух блоков, и сравнить их. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 3, 2012 моменты Ху это не метрика для сравнения пикселей, а характеристики замнкнутых объектов представленных контуром. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
slicktail 1 Жалоба Опубликовано April 3, 2012 моменты Ху это не метрика для сравнения пикселей, а характеристики замнкнутых объектов представленных контуром. А зачем тогда есть возможность вычислять момент матрицы? Может быть эта функция считает контур матрицы и находит именно момент этого контура? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 3, 2012 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 я так предполагаю, что можно передавать как изображение, а можно как массив точек. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
slicktail 1 Жалоба Опубликовано April 3, 2012 Функция может искать моменты не только контуров, но и двоичных изображений: Вот из хелпа: 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 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 3, 2012 polygon or rasterized shape. по любому там подразумевается фигура. можно скармливать бинаризованное без флага. можно скармливать не бинаризованное с флагом и функция интерпретирует как функция воспринимает точки с нулевым значением как точки с нулевым значением, все остальные точки воспринимаются как 1. единственное не знаю нужно ли чтобы контур был замкнут. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
slicktail 1 Жалоба Опубликовано April 3, 2012 по любому там подразумевается фигура. можно скармливать бинаризованное без флага. можно скармливать не бинаризованное с флагом и функция интерпретирует как единственное не знаю нужно ли чтобы контур был замкнут. С другой стороны, вообще-то нигде не говорится, что это контуры. Ну это ж также, центр масс изображения и т.п. - моменты же это и обозначают. Матрица - это изображение. Мне кажется можно и использовать моменты для grayscale Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 4, 2012 хмм ну может быть, но это явно не стандартное применение. 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 вроде бы определено даже. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 3, 2012 сегментация через 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 ); } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mixa7638 5 Жалоба Опубликовано May 3, 2012 вечер добрый. имеется один контур-оригинал довольно простой формы. На другом изображении находим, допустим, десяток контуров. требуется определить тот контур, частью которого является контур-оригинал. с точностью до ошибки, естественно. есть ли готовая функция, реализующая данную операцию? именно по форме. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 4, 2012 контуры замкнутые? контур на котором ищем похож на оригинал или его содержит? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Timofei 0 Жалоба Опубликовано May 4, 2012 Не могу подсчитать длину контура объекта, так как выделяется контур по периметру кадра как от него избавится? Подскажите пожалуйста. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mixa7638 5 Жалоба Опубликовано May 4, 2012 контуры замкнутые? контур на котором ищем похож на оригинал или его содержит? в том и дело что контур не замкнут. на оригинальном изображении устанавливаю РОИ и выбираю самый длинный контур. потом надо на другой картинке найти его - же, но он больше, так как не обрезанный. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 4, 2012 Нарисовать черный прямоугольник размером с кадр Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 5, 2012 ну вообщем лучше картинку покажите, а то я все равно не очень понял. а так можете поискать curve matching и pairwise geometric histogram или просто Geometric Histograms готового кода нету. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mixa7638 5 Жалоба Опубликовано May 5, 2012 буду пробовать) По каринке: тот что оригинал - желтый. ну а требуется найти тот синий что справа. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 5, 2012 теоретически еще можно "пройтись" по большому контуру малым контуром(или разделить его на куски) и посмотреть корреляцию. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mixa7638 5 Жалоба Опубликовано May 5, 2012 а по какому принципу делить, я так понял - синий, контур? на куски длинны, равные длинне желтого контура? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 5, 2012 нет наоборот желтый контур, хотя его можно и не делить если он довольно хорошо вписывается. просто по кусочкам его легче всего вписать, а потом надо смотреть взаимное расположение этих разделенных кусков на синем контуре, если они как бы рядом значит мы желтый хорошо вписали в синий, но если куски будут слишком маленькие, то они впишутся везде, а это не дело, т.е. надо определить все таки какой то минимальный размер, или же надо делить из каких то других соображений, например по кривизне. а вообще можно накладывать сначала целый желтый, потом проверить и попробовать его по частям. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mixa7638 5 Жалоба Опубликовано May 5, 2012 а как контур на контур можно наложить? тогда я бы брался и прикладывался крайней левой нижней точкой желтого контура к каждой точке синего и вычислял бы наилучшее совпадение. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 5, 2012 можно разделить контур на отрезки равной длины и представить контур как список углов(угол наклон отрезка от одной точки до другой). возможно еще надо предварительно кривые сгладить. потом через фурье преобразование сделать кросскорреляцию. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mixa7638 5 Жалоба Опубликовано May 5, 2012 вот как.. ну буду пробовать. в общем виде вроде понял, спасибо) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
slicktail 1 Жалоба Опубликовано May 5, 2012 Хотел бы сравнить два изображения при помощи 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 контуры, то все отлично. Посоветуйте, в чем может быть загвоздка? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах