OpenCV笔记

1、读取图片 imread

参考
img = cv2.imread(‘messi5.jpg’,0) # 0代表灰度模式,每个像素有一个0(黑色)到255(白色)之间的亮度值 灰度概念参考。 默认是1 代表以RGB格式读取。-1代表以原始图像读取(包括alpha通道,即透明度的通道)。

2、导出图片 imwrite

np.unique(picture) # 如果 0 代表黑色,255代表高亮
cv2.imwrite(“~/my_picture.jpg”, picture*255) # 上面只有0 1两种数值时,就需要乘以255。

如果报错False,很可能是不能写 ~ 等的相对地址或简称,一定要绝对地址。

3、一张图像就是NumPy中的数组

OpenCV for Python就是通过NumPy进行绑定的,一张图像就是NumPy中的数组。所以创建图片就是创建np数组。
参考

canvas = np.zeros((300,300,3),dtype=”uint8”) # 全黑的图片
canvas = 255 * np.ones((300,300,3),dtype=”uint8”) # 全白的图片

(1)获取一张图片的大小

参考

print(img.shape) # 格式:(高, 宽, 通道数)

4、显示图片

img = cv2.imread("D:\\cat.jpg")
cv2.namedWindow("Image")
cv2.imshow("Image", img)
cv2.waitKey(0) # 如果不加,在IDLE中执行窗口直接无响应。在命令行中执行的话,则是一闪而过。
cv2.destroyAllWindows() # 释放窗口是个好习惯。

5、读取视频抽帧 cv2.VideoCapture()

参考1 这是很不错的官方文档。
参考2 中文翻译的博客。

cap = cv2.VideoCapture(video_path)
cap.set(1, 0) # 调整第1个属性(控制开始帧),从第0帧开始。具体属性参考官方文档。
res, frame = cap.read() # 第一个是返回True/False的,第二个是当前帧。然后可以不断执行本语句来获取下一帧。
# 随机抽帧的代码实现:
cap = cv2.VideoCapture(vpath)
cap.set(2, 1)  # 到达最后一帧,cap.get(1)获取最大多少帧。
choose =  np.random.randint(int(cap.get(1)))
cap.set(1, choose)  # 读取随机的一帧。
res, frame = cap.read()

下面是常用的几个属性,从0开始数起。
CV_CAP_PROP_POS_MSEC 当前位置视频的毫秒数,第0号属性。
CV_CAP_PROP_POS_FRAMES 下一个被获取的帧的数目是多少。
CV_CAP_PROP_POS_AVI_RATIO 视频的相对位置: 设为0是开始视频位置, 1是结束视频位置。我实践发现,无论 set 该属性成任何值,用get它出来一直都是0.001,不过前两个属性是改变了。所以我通常只会在需要视频末尾时就设为1。
CV_CAP_PROP_FRAME_WIDTH 在视频流中的帧的宽度
CV_CAP_PROP_FRAME_HEIGHT 在视频流中的帧的高度
CV_CAP_PROP_FPS 帧的速率
CV_CAP_PROP_FOURCC 4字节的编码解码器
CV_CAP_PROP_FRAME_COUNT 视频文件的总帧数


注意:
cap.set(2, 1) # 到达最后一帧,cap.get(1)获取最大多少帧。
第一种方法是滑到最后再获取下一帧的编号(总帧数是就是等于这个数值,帧数是从0开始算的),第二种从头不断 cap.read() 获取帧数是有写差别的,还有一种是cap.get(7) 获取总帧数。
实践发现:第一种获取的都是可行的,它得到的总帧数有时比后两种的小。第二、三种方法的结果是一致的,但是后面的帧有些打印出来是不可行的。统一用第一种方法就好了,数据不会乱的,抽出的帧也不会不可行。 具体例子是手掌分割的:1301230091-6550160311243977227 视频。

6、改变图片大小 cv2.resize()

cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None)

参数:

scr:原图
dsize:输出图像尺寸
fx:沿水平轴的比例因子
fy:沿垂直轴的比例因子
interpolation:插值方法,共有5种:
1)INTER_NEAREST - 最近邻插值法
2)INTER_LINEAR - 双线性插值法(默认)
3)INTER_AREA - 基于局部像素的重采样
4)INTER_CUBIC - 基于4x4像素邻域的3次插值法
5)INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值

例子:

res = cv2.resize(img,dsize=(2*width,2*height),interpolation=cv2.INTER_CUBIC)

猜你喜欢

转载自blog.csdn.net/qimiejia5584/article/details/80449811