Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to process image with opencv in python?

I want to use edge detection algorithms from opencv library. Here is a piece of python code:

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)

Loading and showing image works fine, but canny and harris transformations fail.
cvCanny fails with:

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

and cvCornerHarris fails with this error:

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

From this messages I can infer that loaded image has invalid format. But I don't understand how to convert it.
Here are values of some img fields:

img.type = 1111638032
img.nChannels = 3
img.depth = 8
like image 722
max taldykin Avatar asked Feb 15 '11 11:02

max taldykin


People also ask

Can OpenCV do image processing?

OpenCV is a pre-built, open-source CPU-only library (package) that is widely used for computer vision, machine learning, and image processing applications.

How does OpenCV work in image processing?

In OpenCV, images are converted into multi-dimensional arrays, which greatly simplifies their manipulation. For instance, a grayscale image is interpreted as a 2D array with pixels varying from 0 to 255.

How do I open an image in OpenCV Python?

In OpenCv module,we can use the function cv2. imread() to read an image. When inputting the image path, the image should be in the working directory or a full path of image should be given.


2 Answers

For other folks interested in the same type of problem I recommend checking out http://simplecv.org

Here is a bit of code I wrote that does line detection on an image acquired from a webcam. It will even display the image over 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)

Check out the project I made this for at http://labs.radiantmachines.com/beard/ It will detect how long your neck beard is :)

like image 165
Gourneau Avatar answered Sep 28 '22 10:09

Gourneau


Here's fixed code. See comments inline. Long story short: your data types were wrong. Read the 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)
like image 23
mpenkov Avatar answered Sep 28 '22 09:09

mpenkov