\
推荐使用原始字符串r'()'
来输入(单引号可替换为双引号或三引号)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)
利用电脑摄像头从外界拍摄一幅自己的图像,添加圆(或其他图形)
给自己打码,图片右下角添加自己的网名和时间。
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()
resize()
参数的输入顺序应该为高 宽cv2.INTER_AREA
, 在扩展时我们推荐使用 cv2.INTER_CUBIC(慢)
和 cv2.INTER_LINEAR
。 默认情况下所有改变图像尺寸大小的操作使用的插值方法都是 cv2.INTER_LINEAR
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()