OpenCV for Python 学习笔记 一

时间:2022-05-17 15:07:58

本人的学习笔记主要记录的是学习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://*.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类型,就好了

至于此处的问题,大家自己理解吧,我这说不清楚

今天第一天,并没有多少硬货。加油!