本人的學習筆記主要記錄的是學習opencv-python-tutorials這本書中的筆記
今天晚上簡單學習OpenCV for Python如何繪圖,主要用了這幾個函數(這幾個函數可在:http://docs.opencv.org/modules/core/doc/drawing_functions.html 找到):
cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]])
cv2.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]])
一開始自己照抄書上代碼,代碼如下:
import numpy as np import cv2 img = np.zeros((512,512,3), np.uint8) img = cv2.line(img, (1,1),(510,510), (255,0,0),5) img = cv2.rectangle(img, (200,100), (100,200), (0,255,0), 3) img = cv2.circle(img, (100,100), 63, (0,0,255), -1) img = cv2.ellipse(img, (256,256), (100,50), 0, 0, 180, 255, -1) cv2.imshow('hello', img) cv2.waitKey(0) cv2.destroyAllWindows()
總是在運行到cv2.imshow()這出錯,錯誤代碼:
error: (-215) size.width>0 && size.height>0 in function imshow
大致意思是要求img的尺寸必須是大於0的,可是書上是這么寫的啊?
回想在C里面用OpenCV繪圖時,直接調用繪圖函數即可,貌似不需要加返回值,於是自己嘗試着去掉返回值,每次都是直接在img上繪圖,沒有返回值
cv2.line(img, (1,1),(510,510), (255,0,0),5) cv2.rectangle(img, (200,100), (100,200), (0,255,0), 3) cv2.circle(img, (100,100), 63, (0,0,255), -1) cv2.ellipse(img, (256,256), (100,50), 0, 0, 180, 255, -1)
果然就可以了
自己想了想,如果將返回值賦值img,那么img表示的應該是繪圖是否成功的標志,而不是img本身了
上網搜了搜,在:http://docs.opencv.org/modules/core/doc/drawing_functions.html 找到了官網的注釋,說這些函數的返回值都是None(難怪不能imshow)
這個問題解決了,開始繪制多邊形
加了下面的代碼:
pts = np.array([[10,5], [34,23],[231,54], [76,98]], np.uint8) pts = pts.reshape((-1,1,2)) cv2.polylines(img, [pts], True, (0,255,255))
又出錯。。
error: (-215) p.checkVector(2, CV_32S) >= 0 in function polylines
google之,http://stackoverflow.com/questions/11270250/what-does-the-python-interface-to-opencv2-fillpoly-want-as-input 解決方法如下:
將最后一行改成如下形式:
cv2.polylines(img, np.array([pts], np.int32), True, (0,255,255))
將[pts]轉換成32int的numpy.array類型,就好了
至於此處的問題,大家自己理解吧,我這說不清楚
今天第一天,並沒有多少硬貨。加油!