pnp2000 0 Жалоба Опубликовано April 21, 2013 Вобщем есть такая задачка, надо на столе находить объекты и классифицировать их в соответствии базой, грубо говоря на столе есть несколько листов бумаги разных форм и размеров, надо с достаточно большой точностью (не более 0,5-1vv) найти их положение, в принципе камера находится на фиксированном расстоянии от стола и размеры искомых объектов есть, делаю всё на питоне, как я понимаю тут подходит cvMatchTemplate, или тут нужен другой подход, читал про распознание фигур но если фигура не меняет угла и расстояние то по видимому cvMatchTemplate будет работать быстрее и надёжнее, или я не прав??? просто только недавно начал мучать питона и opencv Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 22, 2013 грубо говоря на столе есть несколько листов бумаги разных форм и размеров если это фигуры, то можно выделить контуры и потом сравнить их с эталонными через matchShapes. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
pnp2000 0 Жалоба Опубликовано April 22, 2013 если это фигуры, то можно выделить контуры и потом сравнить их с эталонными через matchShapes. да я уже тоже начал тоже думать что MatchTemplate не самый лучший вариант, как я понимаю MatchTemplate это простое побитовое вычитание массива до тех пор пока сумма всех значений не станет равна нулю, пойду покурю matchShapes , а то получается любой поворот фигуры и она уже не определяется MatchTemplate'ом Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BeS 53 Жалоба Опубликовано April 22, 2013 Все зависит от характера объектов. Вы-бы лучше выложили пример изображения с объектами. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
pnp2000 0 Жалоба Опубликовано April 22, 2013 Все зависит от характера объектов. Вы-бы лучше выложили пример изображения с объектами. да пока натурного макета нету и картинки пока тоже нету, я вот только не понимаю может ли matchShapes или MatchContours работать с контурами если они могут сдвигаться на произвольный угол Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 22, 2013 Это как ответ подойдет? http://www.compvision.ru/forum/index.php?showtopic=6 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
pnp2000 0 Жалоба Опубликовано April 23, 2013 Это как ответ подойдет? http://www.compvision.ru/forum/index.php?showtopic=6 Наверно да, в принципе ситуация похожая главное чтобы чтоб зработало под питоном, а то я недавно нашёл интересную функцию в OpenCV ,а под питоном она не реализованна , но тут по беглому изучению кода вроде проблем не должно быть, спасибо за инфу, будет чем занять выходные Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
pnp2000 0 Жалоба Опубликовано April 23, 2013 Вот попытался попробовать с cv.MatchShapes capture = cv.CaptureFromCAM(0) mask_xgo = cv.LoadImage('go.jpg') while True: frame = cv.QueryFrame(capture) image_size = cv.GetSize(frame) grayscale = cv.CreateImage(image_size, 8, 1) image_size_mask = cv.GetSize(mask_xgo) mask = cv.CreateImage(image_size_mask, 8, 1) cv.SetZero(grayscale) cv.SetZero(mask) cv.CvtColor(frame, grayscale, cv.CV_BGR2GRAY); cv.CvtColor(mask_xgo, mask, cv.CV_BGR2GRAY); MatchShapes = "2342.34" float(MatchShapes) MatchShapes = cv.MatchShapes(mask, grayscale, cv.CV_CONTOURS_MATCH_I2, None) всёвремя вываливается в TypeError: 'a float is required' ужк блин незнаю что нетак делаю Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 23, 2013 Я в питоне не советчик, посмотрите, может тут что есть: http://www.compvision.ru/forum/index.php?showtopic=996 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 24, 2013 CreateImage(image_size_mask, 8, 1) ну так надо изображение флоат создавать наверно. и я не знаю как MatchShapes работает с картинками кстати и еще там новый интерфейс cv2 так и есть, надо CV_32F или CV_32S из сорцов double cv::matchShapes( InputArray _contour1, InputArray _contour2, int method, double parameter ) { Mat contour1 = _contour1.getMat(), contour2 = _contour2.getMat(); CV_Assert(contour1.checkVector(2) >= 0 && contour2.checkVector(2) >= 0 && (contour1.depth() == CV_32F || contour1.depth() == CV_32S) && contour1.depth() == contour2.depth()); CvMat c1 = Mat(contour1), c2 = Mat(contour2); return cvMatchShapes(&c1, &c2, method, parameter); } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
pnp2000 0 Жалоба Опубликовано April 28, 2013 сделал mat_mask = cv.GetMat(mask) mat_grayscale = cv.GetMat(grayscale) MatchShapes = cv.MatchShapes(mat_mask, mat_grayscale, cv2.cv.CV_CONTOURS_MATCH_I2, None) всё-равно тоже самое, и как на зло примеров на питоне нету, чтобы хоть посмотреть как это должно работать Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 28, 2013 Выше ошибся со ссылкой. Надо сюда: http://www.compvision.ru/forum/index.php?showtopic=996 Правда MatchShapes я там не нашел. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
pnp2000 0 Жалоба Опубликовано April 28, 2013 Выше ошибся со ссылкой. Надо сюда: http://www.compvision.ru/forum/index.php?showtopic=996 Правда MatchShapes я там не нашел. Вот и я о том же, я хоть и не силён в питоне но пока более менее разбирался с тем функциями которые пробовал, а в эту просто упёрся и немогу понять что не так Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 28, 2013 Можно свою написать, благо все формулы даны в хелпе. http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=matchshapes#cv.MatchShapes считаются через моменты Ху: http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=matchshapes#humoments которые считаются через моменты контуров: http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=matchshapes#moments И не такие-уж сложные. Заодно и в теме разберетесь Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 29, 2013 mat_mask = cv.GetMat(mask) mat_grayscale = cv.GetMat(grayscale) MatchShapes = cv.MatchShapes(mat_mask, mat_grayscale, cv2.cv.CV_CONTOURS_MATCH_I2, None) что тоже самое? попробуйте выделить контуры и пихать их, а не изображения. вот как тут, через cv.FindContours (правда интерфейс тут старый) http://stackoverflow.com/questions/8785664/finding-shapes-in-an-image-using-opencv Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
pnp2000 0 Жалоба Опубликовано April 29, 2013 попробуйте выделить контуры и пихать их, а не изображения. вот как тут, через cv.FindContours (правда интерфейс тут старый) http://stackoverflow.com/questions/8785664/finding-shapes-in-an-image-using-opencv Вобщем попробовал совать контуры но один хрен ничего не получается, я непонимаю как этот MatchShapes работает, у меня уже вообще такое чусвство что это dummy функция и она вообще непашет в принципе Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
pnp2000 0 Жалоба Опубликовано May 4, 2013 Вобщем в проблеме float я разобрался, и всё вроде даже работает, но только если я сравниваю фигуры на одной картинке, при сравнении с другой картинкой возвращает нули, с чем это может быть связанно???? # !/opt/local/bin/python2.7 # -*- coding: cp1251 -*- """Чтобы не ругался на русские коментарии""" import cv,cv2,numpy in_image = cv.LoadImage('/Users/test_img2.jpg') match_image = cv.LoadImage('/Users/test_sample_img.jpg') in_gray = cv.CreateImage(cv.GetSize(in_image),cv.IPL_DEPTH_8U, 1 ) in_binary = cv.CreateImage(cv.GetSize(in_image),cv.IPL_DEPTH_8U, 1 ) in_out = cv.CreateImage(cv.GetSize(in_image),cv.IPL_DEPTH_8U, 1 ) match_gray = cv.CreateImage(cv.GetSize(match_image),cv.IPL_DEPTH_8U, 1 ) match_binary = cv.CreateImage(cv.GetSize(match_image),cv.IPL_DEPTH_8U, 1 ) match_out = cv.CreateImage(cv.GetSize(match_image),cv.IPL_DEPTH_8U, 1 ) cv.CvtColor(in_image,in_gray,cv.CV_RGB2GRAY) cv.CvtColor(match_image,match_gray,cv.CV_RGB2GRAY) #cv.InRangeS(in_gray,cv.Scalar(20),cv.Scalar(230),in_binary) cv.Canny (in_gray, in_binary, 150 , 250 , 3) cv.Canny (match_gray, match_binary, 150 , 200 , 3) in_storage = cv.CreateMemStorage(0) match_storage = cv.CreateMemStorage(0) #находим контуры и моменты in_contours = cv.FindContours(in_binary,in_storage,cv.CV_RETR_TREE,cv.CV_CHAIN_APPROX_SIMPLE ,(0,0)) in_moments = cv.Moments(in_contours) match_contours = cv.FindContours(match_binary,match_storage,cv.CV_RETR_TREE,cv.CV_CHAIN_APPROX_SIMPLE ,(0,0)) match_moments = cv.Moments(match_contours) in_contours_ = match_contours while in_contours!= None: cv.DrawContours(in_image,in_contours,cv.CV_RGB(0,250,0), cv.CV_RGB(0,250,0),2) cv.DrawContours(in_out,in_contours,cv.CV_RGB(250,250,0), cv.CV_RGB(0,250,250),2) match_ = cv.MatchShapes(in_contours,in_contours_ , cv.CV_CONTOURS_MATCH_I3) #cv.Circle(in_image,in_contours,20,cv.CV_RGB(255,0,0),1,8,0) print in_contours in_contours = in_contours.h_next() match_contours while match_contours!= None: cv.DrawContours(match_image,match_contours,cv.CV_RGB(0,250,0), cv.CV_RGB(0,250,0),2) match_contours = match_contours.h_next() #Создаем окна и показываем в них изображения cv.NamedWindow('Original',cv.CV_WINDOW_AUTOSIZE) cv.MoveWindow('Original',0,40) cv.NamedWindow('Gray',cv.CV_WINDOW_AUTOSIZE) cv.MoveWindow('Gray',200,40) cv.NamedWindow('Contours',cv.CV_WINDOW_AUTOSIZE) cv.MoveWindow('Contours',0,280) cv.NamedWindow('Binary',cv.CV_WINDOW_AUTOSIZE) cv.MoveWindow('Binary',200,280) cv.NamedWindow('Match_Contours',cv.CV_WINDOW_AUTOSIZE) cv.MoveWindow('Match_Contours',400,280) cv.ShowImage('Original',in_image) cv.ShowImage('Gray',in_gray) cv.ShowImage('Contours',in_out) cv.ShowImage('Binary',in_binary) cv.ShowImage('Match_Contours',match_image) #print in_moments cv.WaitKey(0) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах