计算机视觉openCV+python学习

学习openCV

基本操作

读取图像:

显示图像:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

保存图像:

在这里插入图片描述

画图

画线:

画一条从左上方到右下角的蓝色线段

要告诉函数这条线的起点和终点

# 生成一张黑色的图像
img = np.zeros((512, 512, 3), dtype=np.uint8)
# 画出一条粗细为5px的蓝色线段
cv2.line(img, (0, 0), (511, 511), (255, 0, 0), 5)

# 使用cv显示图像
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 使用plt显示图像
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()

在这里插入图片描述

在这里插入图片描述

画方形:

参数:左上角坐标和右下角坐标

我们在图片的右上方位置画一个绿色的方形

img = np.zeros((512, 512, 3), dtype=np.uint8)

cv2.rectangle(img, (384, 0), (310, 128), (0, 255, 0), 3)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()

画圆:

要画圆的话,只需要指定圆形的中心坐标和半径大小。

img = np.zeros((512, 512, 3), dtype=np.uint8)

cv2.circle(img, center=(250, 250), radius=30, color=(255, 0, 0), thickness=5)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()

在这里插入图片描述

画椭圆:

ellipse(img,center,axes,angle,startAngle,endAngle,color,thickness,lineType)

img:椭圆在哪个图片上画

center:椭圆中心点位置

axes:长轴和短轴的长度

angle:整个椭圆延逆时针方向旋转的角度

startAngle,endAngle:椭圆弧面沿顺时针方向起始的角度和结束角度,如果是0,360,就是整个椭圆在图片中间绘制半个椭圆。

img = np.zeros((512, 512, 3), dtype=np.uint8)

cv2.ellipse(img, (250, 250), (50, 30), 0, 0, 360, (255, 0, 0), 5)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()

在这里插入图片描述

画多边形:

画多边形,实际是在画一组线段。

要绘制多边形,首先需要顶点的坐标。

将这些点组成一个形状为ROWS×1×2的数组,其中ROWS是顶点的数量,类型必须为int32.

这里我们用黄色画了一个有四个顶点的小多边形。

# 生成一张黑色的图像
img = np.zeros((512, 512, 3), dtype=np.uint8)
pts = np.array([[100, 100], [300, 150], [400, 400], [50, 350]], np.int32)
# 如果这里的True改为False,将会得到连接点的折线,而不是封闭的图形。
cv2.polylines(img, [pts], True, (0, 255, 255), 10)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()

在这里插入图片描述

在图片上添加文字:

要在图片上绘制文字,你需要设置下列参数:

  • 要绘制的文字
  • 要绘制的位置
  • 字体类型
  • 字体大小
  • 文字的一般属性如颜色、粗细、线条类型等
img = np.zeros((512, 512, 3), dtype=np.uint8)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'Opencv', (10, 300), font,4, (255, 255, 255), 10)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()

在这里插入图片描述

案例(绘制一个opencv的logo):

img = np.full((512, 512, 3), fill_value=255, dtype=np.uint8)
cv2.ellipse(img, (269, 106), (100, 100), 0, 0, 360, (0, 0, 255), -1)
cv2.ellipse(img, (160, 300), (100, 100), 0, 0, 360, (0, 255, 0), -1)

cv2.ellipse(img, (269, 106), (40, 40), 0, 0, 360, (255, 255, 255), -1)
cv2.ellipse(img, (160, 300), (40, 40), 0, 0, 360, (255, 255, 255), -1)

pts = np.array([[269, 106], [160, 300], [390, 300]], np.int32)
cv2.polylines(img, [pts], True, (255, 255, 255), 1)
cv2.fillPoly(img, [pts], (255, 255, 255))

cv2.ellipse(img, (390, 300), (100, 100), 0, -60, 240, (255, 0, 0), -1)
cv2.ellipse(img, (390, 300), (40, 40), 0, 0, 360, (255, 255, 255), -1)

cv2.putText(img, "OpenCV", (100, 480), cv2.FONT_HERSHEY_SIMPLEX,3, (0, 0, 0), 5)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()

在这里插入图片描述

鼠标绘图与调色板

鼠标当画笔

学习使用OpenCV处理鼠标事件

主要函数:cv.setMouseCallback()

查看支持的鼠标操作

你可以通过执行下列代码查看所有被支持的鼠标事件

events = [i for i in dir(cv2) if 'EVENT' in i]
print(events)

fonts = [i for i in dir(cv2) if 'FONT' in i]
print(fonts)

在这里插入图片描述

双击鼠标画出一个圆

响应鼠标动作的程序模式差不多,只是函数不一样而已。

下面我们创建一个程序,可以每双击鼠标画出一个圆,按"esc"退出

# 响应鼠标操作的函数
def draw_circle(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img, (x, y), 100, (255, 0, 0), -1)


img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow("image")
cv2.setMouseCallback("image", draw_circle)
while (1):
    cv2.imshow("image", img)
    if cv2.waitKey(1000) & 0xFF == 27:
        break
cv2.destroyAllWindows()

拖动鼠标绘制矩形或圆圈

根据我们选择的模式在拖动鼠标时绘制矩形或者是曲线(就像画图程序中一样)

我们的回调函数包含两部分,一部分画矩形,一部分画曲线

这个例子可以帮助理解人机交互程序的原理,如物体跟踪,图像分割等

# 默认False,鼠标按下是为True
drawing = False
# if True,画出矩形,按'm'切换到曲线。
mode = True
ix, iy = -1, -1


# 响应鼠标的函数
def draw_circle(event, x, y, flags, param):
    global ix, iy, drawing, mode
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix, iy = x, y
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
            if mode == True:
                cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
            else:
                cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        if mode == True:
            cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
        else:
            cv2.circle(img, (x, y), 5, (0, 0, 255), -1)


img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow("image")
cv2.setMouseCallback("image", draw_circle)
while (1):
    cv2.imshow("image", img)
    k = cv2.waitKey(1) & 0xFF
    # 按下‘m'键切换模式
    if k == ord('m'):
        mode = not mode
    elif k == 27:
        break
cv2.destroyAllWindows()

案例:鼠标绘图,使用调色板调节颜色

def nothing(x):
    pass

def draw(event, x, y, flags, param):
    global ix, iy, drawing
    if event == cv2.EVENT_LBUTTONDOWN:
        ix = x
        iy = y
    elif event == cv2.EVENT_LBUTTONUP:
        r = cv2.getTrackbarPos("R", "image")
        g = cv2.getTrackbarPos("G", "image")
        b = cv2.getTrackbarPos("B", "image")
        cv2.rectangle(img, (ix, iy), (x, y), (r, g, b), -1)


img = np.full((512, 512, 3), 255, np.uint8)
cv2.namedWindow("image")
cv2.setMouseCallback("image", draw)
cv2.createTrackbar("R", "image", 0, 255, nothing)
cv2.createTrackbar("G", "image", 0, 255, nothing)
cv2.createTrackbar("B", "image", 0, 255, nothing)

while (1):
    cv2.imshow("image", img)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值