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
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.type = 1111638032 img.nChannels = 3 img.depth = 8
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) 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)
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.
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 :)