OpenCV学习笔记

关于OpenCV

  • ​ OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序-----wikipedia。

Task1:Opencv基本了解、图像读取、绘图

学习地址

思考题

  • 输入本地地址时因为地址中含有\推荐使用原始字符串r'()'来输入(单引号可替换为双引号或三引号)
    Q:Opencv库与Matlab、Halcon的区别?
    A:
    Halcon:底层功能算法多,运算性能快,功能齐全,容易上手,开发项目周期短。非开源项目,商用收费,价格较贵。
    OpenCV:功能算法相对较多(比Halcon少),开源,可用于商用,开发周期较长(比Halcon长),有些算法要自己写。轻量且高效。
    Matlab:Matlab一般用于快速实现算法和测试,用于研究理论,OpenCV适合开发实际的图像处理或视觉的应用。

Q:为什么是import cv2?
A: 此处 ‘2’ 表示的并不是opencv的版本号,OpenCV是基于C/C++的,”cv”和”cv2”表示的是底层C API和C++API的区别,”cv2”表示使用的是C++API。

Q:在显示完之后,用不用cv.destroyWindow()有什么区别?
A:cv.destroyWindow()用来一个特定的窗口

Q:png图片格式和jpg图片格式有什么区别?
A:PNG是无损压缩的图片,JPG是有损压缩;PNG支持透明,JPG不支持。

练习题:

同时显示两张不同分辨率的图片,对比他们的大小;
在这里插入图片描述

使用Opencv,测试一下你电脑摄像头的分辨率和帧率是多少;

import cv2 as cv

video = cv.VideoCapture(r"C:\Users\86152\Videos\3.mp4")#读取用电脑摄像头录制好的视频
while video.isOpened():
    ret, frame = video.read()
    if ret:
        cv.imshow("frame", frame)
    else:
        print("视频播放完成!")
        break
    # 退出播放
    key = cv.waitKey(25)
    if key == 27:  # 按键esc
        break

fps = video.get(cv.CAP_PROP_FPS)   #读取帧率
size = (int(video.get(cv.CAP_PROP_FRAME_WIDTH)),int(video.get(cv.CAP_PROP_FRAME_HEIGHT)))#读取分辨率
print(fps)
print(size)

# 3.释放资源
video.release()
cv.destroyAllWindows()


#结果
#视频播放完成!
#29.74641183907191
#(640, 480)

利用电脑摄像头从外界拍摄一幅自己的图像,添加圆(或其他图形)
给自己打码,图片右下角添加自己的网名和时间。
在这里插入图片描述

Task2:图像储存、色彩空间、图像的算术运算

学习地址

练习题

1、HSV和BGR三原色在图片信息存储的差别在哪?
RGB:以R(Red:红)、G(Green:绿)、B(Blue:蓝)三种基本色为基础,进行不同程度的叠加,产生丰富而广泛的颜色。所以储存的信息为R\G\B三种颜色的数值
HSV:和RGB颜色模型相似,也是由三个属性决定颜色,H、S、V分别是色彩、深度、明暗。所以储存信息为H\S\V三个属性多对应数值。

2、代码调用电脑摄像头,寻找视野中任意颜色(自定)并具有一定大小的物体,并用矩形框处,最后显示在图像上:

import cv2 as cv
import numpy as np

cap = cv.VideoCapture(0, cv.CAP_DSHOW)
while 1:
    # 读取每一帧
    ret, frame = cap.read()
    # 将 RGB 转化为 HSV
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # 设置橘色范围
    orange_low = np.array([5, 100, 46])
    orange_up = np.array([20, 255, 255])

    # 设置一个橘色的蒙版,找出图片中的橘色区域
    mask = cv.inRange(hsv, orange_low, orange_up)
    # 对橘色区域所在的蒙版进行高斯模糊处理
    mask = cv.GaussianBlur(mask, (3, 3), 0)
    # 查找蒙版区域的边界
    (cnt_s, _) = cv.findContours(mask.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    # 如果找到了轮廓,即发现了橘色区域
    if len(cnt_s) > 0:
        # 找出面积最大的轮廓,按照面积逆序排列
        cnt = sorted(cnt_s, key=cv.contourArea, reverse=True)

        # # 只会标出最大的橙色区域
        # # 寻找能包络橘色区域的最小长方形
        # rect = np.int32(cv.boxPoints(cv.minAreaRect(cnt[0])))
        # # 用线条绘制
        # cv.drawContours(frame, [rect], -1, (0, 255, 0), 2)

        # 标出多个橙色区域
        for i in cnt:
            if len(i) > 60:
                rect = np.int32(cv.boxPoints(cv.minAreaRect(i)))
                cv.drawContours(frame, [rect], -1, (0, 255, 0), 2)

    # mask 和 原图叠加
    res = cv.bitwise_and(frame, frame, mask=mask)
    cv.imshow('frame', frame)
    cv.imshow('mask', mask)
    cv.imshow('res', res)
    k = cv.waitKey(5) & 0xFF
    if k == 27:  # 按下 esc 退出
        break
cv.destroyAllWindows()

成果图

3、创建一个视频用来演示一幅图如何平滑的转换成另一幅图(使用函数cv.addWeighted)

import cv2 as cv

img1 = cv.imread(r'C:\Users\86152\Pictures\2.jpg', cv.IMREAD_COLOR)
img2 = cv.imread(r'C:\Users\86152\Pictures\3.jpg', cv.IMREAD_COLOR)

fps = 30
file_path = r"C:\Users\86152\Videos\add_res.avi"  # 导出路径
fourcc = cv.VideoWriter_fourcc(*'XVID')  # 设置编码器
video = cv.VideoWriter(file_path, fourcc, fps, (1920, 1080))

for i in range(0, 101):
    x = i / 100
    y = 1 - x
    dst = cv.addWeighted(img1, x, img2, y, 0) # 调整权重混合图片,纵享丝滑
    video.write(dst) # 将合成图片写入视频
    cv.namedWindow("dst", 0)
    cv.imshow('dst', dst)
    cv.waitKey(1)

cv.waitKey(0)
cv.destroyAllWindows()

Task3:几何变换

  • 戳我
  • 注意:shape得到的是图片的 高 宽resize() 参数的输入顺序应该为高 宽
  • resize()插值方法:缩放时推荐使用 cv2.INTER_AREA, 在扩展时我们推荐使用 cv2.INTER_CUBIC(慢)cv2.INTER_LINEAR。 默认情况下所有改变图像尺寸大小的操作使用的插值方法都是 cv2.INTER_LINEAR
  • cv2.getPerspectiveTransform 透视变换

练习题

  • 将下面纸张通过变换调节至正中央水平竖直放置,最终呈现的图片效果上要保留白纸外的区域:
    在这里插入图片描述
import cv2 as cv
import numpy as np

img = cv.imread(r'C:\Users\86152\Pictures\task3_1.jpg')
cv.namedWindow('img', 0)
cv.imshow('img', img)

w, h, x = img.shape
print(w, h)
point1 = np.array([[2151, 489], [3499, 1033], [351, 1585], [1979, 2925]], dtype="float32")  # 源图像中待测矩形的四点坐标
point2 = np.array([[0, 0], [476, 0], [0, 674], [476, 674]], dtype="float32") # 目标图像中矩形的四点坐标
M = cv.getPerspectiveTransform(point1, point2)
out_img = cv.warpPerspective(img, M, (476, 674))  # 这个大致是A4纸的比例

cv.imshow('out_img', out_img)
cv.waitKey(0)
cv.destroyAllWindows()

成果图
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值