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

pnp2000

Пользователи
  • Количество публикаций

    9
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные пользователем pnp2000


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


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

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

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

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


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

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

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

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


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

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


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

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

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


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

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


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

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


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

×