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

Распознавание объектов на столе

Recommended Posts

Вобщем есть такая задачка, надо на столе находить объекты и классифицировать их в соответствии базой, грубо говоря на столе есть несколько листов бумаги разных форм и размеров, надо с достаточно большой точностью (не более 0,5-1vv) найти их положение, в принципе камера находится на фиксированном расстоянии от стола и размеры искомых объектов есть, делаю всё на питоне, как я понимаю тут подходит cvMatchTemplate, или тут нужен другой подход, читал про распознание фигур но если фигура не меняет угла и расстояние то по видимому cvMatchTemplate будет работать быстрее и надёжнее, или я не прав??? просто только недавно начал мучать питона и opencv

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


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

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

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


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

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

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

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


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

Все зависит от характера объектов. Вы-бы лучше выложили пример изображения с объектами.

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


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

Все зависит от характера объектов. Вы-бы лучше выложили пример изображения с объектами.

да пока натурного макета нету и картинки пока тоже нету, я вот только не понимаю может ли matchShapes или MatchContours работать с контурами если они могут сдвигаться на произвольный угол

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


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

Это как ответ подойдет?

http://www.compvision.ru/forum/index.php?showtopic=6

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


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

Это как ответ подойдет?

http://www.compvision.ru/forum/index.php?showtopic=6

Наверно да, в принципе ситуация похожая :) главное чтобы чтоб зработало под питоном, а то я недавно нашёл интересную функцию в OpenCV ,а под питоном она не реализованна :( , но тут по беглому изучению кода вроде проблем не должно быть, спасибо за инфу, будет чем занять выходные :)

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


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

Вот попытался попробовать с 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'

ужк блин незнаю что нетак делаю :(

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


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

Я в питоне не советчик,

посмотрите, может тут что есть:

http://www.compvision.ru/forum/index.php?showtopic=996

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


Ссылка на сообщение
Поделиться на других сайтах
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);

}

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


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

сделал


    mat_mask = cv.GetMat(mask)

    mat_grayscale = cv.GetMat(grayscale)

    MatchShapes = cv.MatchShapes(mat_mask, mat_grayscale, cv2.cv.CV_CONTOURS_MATCH_I2, None)

всё-равно тоже самое, и как на зло примеров на питоне нету, чтобы хоть посмотреть как это должно работать

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


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

Выше ошибся со ссылкой.

Надо сюда: http://www.compvision.ru/forum/index.php?showtopic=996

Правда MatchShapes я там не нашел.

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


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

Выше ошибся со ссылкой.

Надо сюда: http://www.compvision.ru/forum/index.php?showtopic=996

Правда MatchShapes я там не нашел.

Вот и я о том же, я хоть и не силён в питоне но пока более менее разбирался с тем функциями которые пробовал, а в эту просто упёрся и немогу понять что не так

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


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

Можно свою написать, благо все формулы даны в хелпе.

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

И не такие-уж сложные. Заодно и в теме разберетесь :)

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


Ссылка на сообщение
Поделиться на других сайтах
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

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


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

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

вот как тут, через cv.FindContours (правда интерфейс тут старый)

http://stackoverflow.com/questions/8785664/finding-shapes-in-an-image-using-opencv

Вобщем попробовал совать контуры но один хрен ничего не получается, я непонимаю как этот MatchShapes работает, у меня уже вообще такое чусвство что это dummy функция и она вообще непашет в принципе

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


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

Вобщем в проблеме 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)

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×