时间:2022-06-03 11:07:28 | 栏目:Python代码 | 点击:次
OpenCV图像处理
使用 cv.imread() 函数读取一张图像,图片应该在工作目录中,或者应该提供完整的图像路径。第二个参数是一个 flag,指定了应该读取图像的方式
cv.IMREAD_COLOR:加载彩色图像,任何图像的透明度都会被忽略,它是默认标志
cv.IMREAD_GRAYSCALE:以灰度模式加载图像
cv.IMREAD_UNCHANGED:加载图像,包括 alpha 通道
Note
你可以简单地分别传递整数 1、0 或-1,而不是这三个 flag。
import numpy as np import cv2 as cv # 用灰度模式加载图像 img = cv.imread('messi5.jpg', 0)
即使图像路径错误,它也不会抛出任何错误,但是打印 img会给你None
用 cv.imshow() 函数在窗口中显示图像,窗口自动适应图像的大小。
第一个参数是窗口名,它是一个字符串,第二个参数就是我们的图像。你可以根据需要创建任意数量的窗口,但是窗口名字要不同。
cv.imshow('image', img) cv.waitKey(0) #毫秒级显示,如果是0就是按下任意按键结束显示 cv.destroyAllWindows()
cv.waitKey() 是一个键盘绑定函数,它的参数是以毫秒为单位的时间。该函数为任意键盘事件等待指定毫秒。如果你在这段时间内按下任意键,程序将继续。如果传的是 0,它会一直等待键盘按下。
cv.destroyAllWindows() 简单的销毁我们创建的所有窗口。如果你想销毁任意指定窗口,应该使用函数 cv.destroyWindow() 参数是确切的窗口名。
import numpy as np import cv2 as cv # 用RGB模式加载图像 img = cv.imread('1.jpg', 1) cv.imshow('image', img) cv.waitKey(0) cv.destroyAllWindows()
也可以同时显示两张图像
有一种特殊情况,你可以先创建一个窗口然后加载图像到该窗口。在这种情况下,你能指定窗口是否可调整大小。它是由这个函数完成的 cv.namedWindow()。默认情况下,flag 是 cv.WINDOW_AUTOSIZE。但如果你指定了 flag 为 cv.WINDOW_NORMAL,你能调整窗口大小。当图像尺寸太大,在窗口中添加跟踪条是很有用的。
import numpy as np import cv2 as cv # 用RGB模式加载图像 img = cv.imread('1.jpg', 1) cv.imshow('image', img) cv.waitKey(0) cv.destroyAllWindows()
可以看到图片可以拉伸,也可以自己去对比一下效果。
保存图像,用这个函数 cv.imwrite()。
第一个参数是文件名,第二个参数是你要保存的图像。
import numpy as np import cv2 as cv # 用RGB模式加载图像 img = cv.imread('1.jpg', 1) cv.imwrite('11.jpg',img) #将1.jpg保存为11.jpg cv.namedWindow('image', cv.WINDOW_NORMAL) cv.imshow('image',img) cv.waitKey(0) cv.destroyAllWindows()
图像小结
下面的程序以灰度模式读取图像,显示图像,如果你按下 's‘ 会保存和退出图像,或者按下 ESC 退出不保存。
import numpy as np import cv2 as cv img = cv.imread('11.jpg',0) cv.imshow('image',img) k = cv.waitKey(0) if k == 27: # ESC 退出 cv.destroyAllWindows() elif k == ord('s'): # 's' 保存退出 cv.imwrite('m.jpg',img) cv.destroyAllWindows()
通常,我们用相机捕捉直播。OpenCV 为此提供了一个非常简单的接口。我们用相机捕捉一个视频(我用的电脑内置摄像头),将它转换成灰度视频并显示。去获取一个视频,你需要创建一个VideoCapture对象。它的参数可以是设备索引或者一个视频文件名。设备索引仅仅是摄像机编号。通常会连接一台摄像机(as in my case)。所以我只传了 0(或者-1)。你可以通过传 1 来选择第二个摄像机,以此类推。之后,你能逐帧捕获。但是最后,不要忘记释放这个 Capture 对象。
import numpy as np import cv2 as cv cap = cv.VideoCapture(0) while(True): # 一帧一帧捕捉 ret, frame = cap.read() # 我们对帧的操作在这里 gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # cv.COLOR_BGR2RG显示彩色图像 # 显示返回的每帧 cv.imshow('frame',gray) if cv.waitKey(1) & 0xFF == ord('q'): break # 当所有事完成,释放 VideoCapture 对象 cap.release() cv.destroyAllWindows()
cap.read() 返回一个 bool 值(True/False)。如果加载成功,它会返回True。因此,你可以通过这个返回值判断视频是否结束。
它和从相机捕获一样,只需要用视频文件名更改相机索引。同时显示 frame,为 cv.waitKey() 使用合适的时间。如果它太小,视频将非常快,如果太大,视频将很慢 (嗯,这就是如何显示慢动作)。正常情况下,25 毫秒就可以了。
import numpy as np import cv2 as cv cap = cv.VideoCapture('FinalVideo_1642014289.728580.MP4') while(cap.isOpened()): ret, frame = cap.read() gray = cv.cvtColor(frame, cv.COLOR_BGR2RGB) cv.imshow('frame',gray) if cv.waitKey(1) & 0xFF == ord('q'): break cap.release() cv.destroyAllWindows()
视频只有30秒左右,可以看到视频播放速度很快,像是原视频2倍速播放一样。
我们捕获视频,逐帧处理然后保存下来。对于图像来说,是非常的简单,就用 cv.imwrite()。这里需要做更多的工作。
这次我们创建一个 VideoWriter 对象。我们应该指定输出文件的名字 (例如:output.avi)。然后我们应该指定 FourCC 码。然后应该传递每秒帧数和帧大小。最后一个是 isColor flag。如果是 True,编码器期望彩色帧,否则它适用于灰度帧。
FourCC 是用于指定视频解码器的 4 字节代码。这里 fourcc.org 是可用编码的列表。它取决于平台,下面编码就很好。
In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID 是最合适的. MJPG 结果比较大. X264 结果比较小)
In Windows: DIVX (还需要测试和添加跟多内容)
In OSX: MJPG (.mp4), DIVX (.avi), X264 (.mkv).
对于 MJPG, FourCC 的代码作为 cv.VideoWriter_fourcc(‘M’,‘J’,‘P’,‘G’) 或 cv.VideoWriter_fourcc(‘MJPG’)* 传递。
import numpy as np import cv2 as cv cap = cv.VideoCapture(0) # 声明编码器和创建 VideoWrite 对象 fourcc = cv.VideoWriter_fourcc(*'XVID') out = cv.VideoWriter('output.avi',fourcc, 20.0, (640,480)) while(cap.isOpened()): ret, frame = cap.read() if ret==True: frame = cv.flip(frame,0) # 写入已经翻转好的帧 out.write(frame) cv.imshow('frame',frame) if cv.waitKey(1) & 0xFF == ord('q'): break else: break # 释放已经完成的工作 cap.release() out.release() cv.destroyAllWindows()
可以看到有avi文件生成。
GUI功能是opencv的入门知识,还是很好理解的。