-
用 OpenCV 画不同的几何图形
主要函数:cv.line(), **cv.circle() , cv.rectangle(), cv.ellipse(), cv.putText()
Code
1 上面的这些函数,我们能看到一些相同的参数: 2 3 img:要画的图片 4 5 color:形状的颜色,如 BGR,它是一个元组,例如:蓝色(255,0,0)。对于灰度图,只需传一个标量值。 6 7 thickness: 线或圆等的厚度。如果传 -1 就是像圆的闭合图形,它将填充形状。_ 默认 thickness = 1_ 8 9 lineType:线条类型,如 8 连接,抗锯齿线等。默认情况下,它是 8 连接。**cv.LINE_AA** 画出抗锯齿线,非常好看的曲线。
画线
1 import numpy as np 2 import cv2 as cv 3 4 # 创建一个黑色的图像 5 img = np.zeros((512, 512, 3), np.uint8) 6 # 画一条 5px 宽的蓝色对角线 7 cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5) 8 cv.imshow('image', img) 9 cv.waitKey(0)
画矩形、画圆、画椭圆、画多边形、
1 import numpy as np 2 import cv2 as cv 3 4 # 创建一个黑色的图像 5 img = np.zeros((512, 512, 3), np.uint8) 6 # 在图像上画一个绿色的矩形 7 cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3) 8 # 画圆 9 cv.circle(img,(447,63), 63, (0,0,255), -1) 10 # 画椭圆 11 cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1) 12 # 画多边形 13 pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32) 14 pts = pts.reshape((-1,1,2)) 15 cv.polylines(img,[pts],True,(0,255,255)) 16 17 cv.imshow('image', img) 18 cv.waitKey(0)
鼠标作为画笔
cv.setMouseCallback()
创建鼠标回调函数是有特定的格式,在任何地方都一样。它仅仅是函数的功能不同。因此我们的鼠标回调函数是做一件事,就是我们双击的地方画圆
1 import numpy as np 2 import cv2 as cv 3 4 5 # 鼠标回调函数 6 def draw_circle(event, x, y, flags, param): 7 if event == cv.EVENT_LBUTTONDBLCLK: 8 cv.circle(img, (x, y), 100, (255, 0, 0), -1) 9 10 11 # 创建一个黑色图像,一个窗口,然后和回调绑定 12 img = np.zeros((512, 512, 3), np.uint8) 13 cv.namedWindow('image') 14 cv.setMouseCallback('image', draw_circle) 15 while (1): 16 cv.imshow('image', img) 17 if cv.waitKey(20) & 0xFF == 27: 18 break 19 cv.destroyAllWindows()
作为调色板的跟踪栏
函数:cv.getTrackbarPos(), **cv.createTrackbar()
这里,我们将创建用以显示指定颜色的简单程序。 你有一个显示颜色的窗口和三个轨迹栏,用来指定 B,G,R 颜色。你可以滑动轨迹栏改变窗口的颜色。默认情况下,初始颜色为黑色。
对于 cv.createTrackbar() 函数,第一个参数是轨迹栏名字,第二个参数是被附上的窗口名字,第三个参数是默认值,第四个是最大值,第五个是回调函数——滑条改变所执行的函数。这个回调函数也有一个默认参数,表示轨迹栏位置。我们并不关心函数做什么事,所以只是简单提一下。
轨迹栏的另一个重要应用是用作按钮或者开关。OpenCV在默认情况下没有按钮功能,因此我们用轨迹栏实现这样的功能。在我们的程序中创建了一个开关,其中程序只会在开关打开时有效,否则屏幕始终是黑色。
1 import numpy as np 2 import cv2 as cv 3 4 5 def nothing(x): 6 pass 7 8 9 # 创建一个黑色图像,一个窗口 10 img = np.zeros((300, 512, 3), np.uint8) 11 cv.namedWindow('image') 12 # 创建一个改变颜色的轨迹栏 13 cv.createTrackbar('R', 'image', 0, 255, nothing) 14 cv.createTrackbar('G', 'image', 0, 255, nothing) 15 cv.createTrackbar('B', 'image', 0, 255, nothing) 16 # 创建一个用来启用和关闭功能的开关 17 switch = '0 : OFF \n1 : ON' 18 cv.createTrackbar(switch, 'image', 0, 1, nothing) 19 while (1): 20 cv.imshow('image', img) 21 k = cv.waitKey(1) & 0xFF 22 if k == 27: 23 break 24 # get current positions of four trackbars 25 r = cv.getTrackbarPos('R', 'image') 26 g = cv.getTrackbarPos('G', 'image') 27 b = cv.getTrackbarPos('B', 'image') 28 s = cv.getTrackbarPos(switch, 'image') 29 if s == 0: 30 img[:] = 0 31 else: 32 img[:] = [b, g, r] 33 cv.destroyAllWindows()