how to process image with opencv in python?
我想使用 opencv 库中的边缘检测算法。
这是一段python代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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) |
加载和显示图像工作正常,但 canny 和 harris 转换失败。
1 2 3 4 5 6 | RuntimeError: openCV Error: Status=Unsupported format or combination of formats function name=cvCanny error message= file_name=cv/cvcanny.cpp line=72 |
和
1 2 3 4 5 6 | 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 |
从这条消息我可以推断加载的图像格式无效。但我不明白如何转换它。
以下是一些
1 2 3 | img.type = 1111638032 img.nChannels = 3 img.depth = 8 |
对于对同一类型问题感兴趣的其他人,我建议查看 http://simplecv.org
这是我编写的一些代码,用于对从网络摄像头获取的图像进行线条检测。它甚至会通过 http 显示图像。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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/ 上制作的项目,它会检测你脖子上的胡须有多长:)
这是固定代码。请参阅内联评论。长话短说:你的数据类型是错误的。阅读 API。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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) |
您可以一步而不是两步将图像转换为灰度:
1 2 | gray = cv.CreateMat(img.height, img.width, cv.CV_8UC1) cv.CvtColor(img, gray, cv.CV_BGR2GRAY) |