Как обработать изображение с OpenCV в Python? - PullRequest
5 голосов
/ 15 февраля 2011

Я хочу использовать алгоритмы обнаружения краев из библиотеки opencv. Вот фрагмент кода Python:

from opencv.cv import *
from opencv.highgui import *

img = cvLoadImage ('xxx.jpg')
cvNamedWindow ('img')
cvShowImage ('img', img)
cvWaitKey ()

canny = cvCreateImage (cvSize (img.width, img.height), 8, 3)
cvCanny (img, canny, 50, 200)

harris = cvCreateImage (cvSize (img.width, img.height), 8, 3)
cvCornerHarris (img, harris, 5, 5, 0.1)

Загрузка и показ изображения работают нормально, но преобразования Канни и Харриса не удаются.
cvCanny не удается с:

RuntimeError:  openCV Error:
    Status=Unsupported format or combination of formats
    function name=cvCanny
    error message=
    file_name=cv/cvcanny.cpp
    line=72

и cvCornerHarris завершаются с ошибкой:

RuntimeError:  openCV Error:
    Status=Assertion failed
    function name=cvCornerHarris
    error message=src.size() == dst.size() && dst.type() == CV_32FC1
    file_name=cv/cvcorner.cpp
    line=370

Из этого сообщения я могу сделать вывод, что загруженное изображение имеет неверный формат. Но я не понимаю, как это преобразовать.
Вот значения некоторых полей img:

img.type = 1111638032
img.nChannels = 3
img.depth = 8

Ответы [ 3 ]

8 голосов
/ 10 декабря 2011

Для других людей, интересующихся такой же проблемой, я рекомендую проверить http://simplecv.org

Вот небольшой фрагмент кода, который я написал для обнаружения линий на изображении, полученном с веб-камеры.Он даже будет отображать изображение через http.beard detection

import SimpleCV
import time

c = SimpleCV.Camera(1)
js = SimpleCV.JpegStreamer() 

while(1):
  img = c.getImage()
  img = img.smooth()
  lines = img.findLines(threshold=25,minlinelength=20,maxlinegap=20)
  [line.draw(color=(255,0,0)) for line in lines]
  #find the avg length of the lines
  sum = 0
  for line in lines:
      sum = line.length() + sum
  if sum:
      print sum / len(lines)
  else:
      print "No lines found!"
  img.save(js.framebuffer)
  time.sleep(0.1)

Проверьте проект, для которого я сделал это в http://labs.radiantmachines.com/beard/ Он определит, какова длина вашей бороды на шее:)

6 голосов
/ 15 февраля 2011

Вот фиксированный код.Смотрите комментарии в строке.Короче говоря: ваши типы данных были неправильными.Прочитайте API .

try:
    from opencv.cv import *
    from opencv.highgui import *
except:
    #
    # Different OpenCV installs name their packages differently.
    #
    from cv import *

if __name__ == '__main__':
    import sys
    #
    # 1 = Force the image to be loaded as RGB
    #
    img = LoadImage (sys.argv[1], 1)
    NamedWindow ('img')
    ShowImage ('img', img)
    WaitKey ()

    #
    # Canny and Harris expect grayscale  (8-bit) input.
    # Convert the image to grayscale.  This is a two-step process:
    #   1.  Convert to 3-channel YCbCr image
    #   2.  Throw away the chroma (Cb, Cr) and keep the luma (Y)
    #
    yuv = CreateImage(GetSize(img), 8, 3)
    gray = CreateImage(GetSize(img), 8, 1)
    CvtColor(img, yuv, CV_BGR2YCrCb)
    Split(yuv, gray, None, None, None)

    canny = CreateImage(GetSize(img), 8, 1)
    Canny(gray, canny, 50, 200)
    NamedWindow ('canny')
    ShowImage ('canny', canny)
    WaitKey()

    #
    # The Harris output must be 32-bit float.
    #
    harris = CreateImage (GetSize(img), IPL_DEPTH_32F, 1)
    CornerHarris(gray, harris, 5, 5, 0.1)
2 голосов
/ 10 декабря 2011

Вы можете преобразовать изображение в оттенки серого за один шаг вместо двух:

gray = cv.CreateMat(img.height, img.width, cv.CV_8UC1)
cv.CvtColor(img, gray, cv.CV_BGR2GRAY)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...