一 OpenCV中的GUI特性
图片
读入图像
使用函数 cv2.imread() 读入图像。
- cv2.IMREAD_COLOR:读入一副彩色图像。图像的透明度会被忽略,这是默认参数。
- cv2.IMREAD_GRAYSCALE:以灰度模式读入图像
- cv2.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的 alpha 通道
|
|
警告: 就算图像的路径是错的, OpenCV 也不会提醒你的,但是当你使用命
令print img时得到的结果是None。
显示图像
使用函数 cv2.imshow() 显示图像。窗口会自动调整为图像大小。第一个参数是窗口的名字,其次才是我们的图像。
cv2.waitKey() 是一个键盘绑定函数。需要指出的是它的时间尺度是毫秒级。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果按下任意键,这个函数会返回按键的 ASCII 码值,程序将会继续运行。如果没有键盘输入,返回值为-1,如果我们设置这个函数的参数为0,那它将会无限期的等待键盘输入。它也可以被用来检测特定键是否被按下,例如按键 a 是否被按下。
cv2.destroyAllWindows() 可以轻易删除任何建立的窗口。如果想删除特定的窗口可以使用 cv2.destroyWindow(),在括号内输入你想删除的窗口名。
建议:一种特殊的情况是,也可以先创建一个窗口,之后再加载图像。这种情况下,可以决定窗口是否可以调整大小。使用到的函数cv2.namedWindow()。初始设定函数标签是cv2.WINDOW_AUTOSIZE。但是如果把标签改成cv2.WINDOW_NORMAL,就可以调整窗口大小了。当图像维度太大,或者要添加轨迹条时,调整窗口大小将会很有用.
保存图像
使用函数 cv2.imwrite() 来保存一个图像。首先需要一个文件名,之后才是要保存的图像。
下面的程序将会加载一个灰度图, 显示图片,按下’s’键保存后退出,或者按下 ESC 键退出不保存。
|
|
警告: 如果用的是 32 位系统,需要将 k = cv2.waitKey(0)&0xFF 这行改成
k = cv2.waitKey(0)。
使用Matplotlib
Matplotib 是 python 的一个绘图库,里头有各种各样的绘图方法。
|
|
视频
用摄像头捕获视频
OpenCV提供了一个非常简单的接口。
cap.read()返回一个布尔值。可以使用函数cap.get(propID)来获得视频的一些参数信息。cap.set(propID,value)可以来修改其中的一些值。
例如:使用cap.get(3)和cap.get(4)来查看每一帧的宽和高。默认是640X480。但是可以使用ret = cap.set(3,320)
和ret = cap.set(4,240)来把宽和高改成320X240。
从文件中播放视频
|
|
注意: 你应该确保你已经装了合适版本的 ffmpeg 或者gstreamer。如果你装错了那就比较头疼了。
保存视频
对于图片来时很简单只需要使用 cv2.imwrite()。但对于视频来说就要多做点工
作。要创建一个 VideoWriter的对象。确定一个输出文件的名字。接下来指定FourCC编码。播放频率和帧的大小也都需要确定。最后一个是 isColor 标签。
FourCC码以下面的格式传给程序,以MJPG为例:cv2.cv.FOURCC(‘M’,’J’,’P’,’G’)或者cv2.cv.FOURCC(*’MJPG’)。
下面的代码是从摄像头中捕获视频,沿水平方向旋转每一帧并保存它。
OpenCV中的绘图函数
需要设置的参数:
• img:你想要绘制图形的那幅图像。
• color:形状的颜色。以RGB 为例,需要传入一个元组,例如:(255,0,0)
代表蓝色。对于灰度图只需要传入灰度值。
• thickness:线条的粗细。如果给一个闭合图形设置为-1,那么这个图形
就会被填充。默认值是1.
• linetype:线条的类型,8 连接,抗锯齿等。默认情况是 8 连接。cv2.LINE_AA
为抗锯齿,这样看起来会非常平滑。
画线
要画一条线只需要告诉画这条线的起点和终点。
画矩形
需要矩形的左上角顶点和右下角顶点坐标。
画圆
指定圆形的中心坐标和半径大小。
画椭圆
画椭圆比较复杂,要多输入几个参数。一个参数是中心点的位置坐标。下一个参数是长轴和短轴的长度。椭圆沿逆时针方向旋转的角度。椭圆弧演顺时针方向起始的角度和结束角度,如果是0和360,就是整个椭圆。查看cv2.ellipse()可以得到更多信息。下面的例子是在图片的中心绘制半个椭圆。
画多边形
画多边形,需要指出每个顶点的坐标。用这些点的坐标构建一个大小等于行数 X1X2 的数组,行数就是点的数目。这个数组的数据类型必须为int32。这里画一个黄色的具有四个顶点的多边形。
注意: 如果第三个参数是 False,我们得到的多边形是不闭合的(首尾不相连)。
注意: cv2.polylines() 可以被用来画很多条线。 只需要把想要画的线放在一个列表中,将这个列表传给函数就可以了。每条线都会被独立绘制。这会比用cv2.line() 一条一条的绘制要快一些。
在图片上添加文字
要在图片上绘制文字,需要设置下列参数:
• 要绘制的文字
• 要绘制的位置
• 字体类型(通过查看 cv2.putText() 的文档找到支持的字体)
• 字体的大小
• 文字的一般属性如颜色,粗细,线条的类型等。为了更好看一点推荐使用linetype=cv2.LINE_AA。
在图像上绘制白色的 OpenCV。
警告:所有的绘图函数的返回值都是None,所以不能使用img=cv2.line(img,(0,0),(511,511),(255,0,0),5)。
结果
下面就是最终结果了,通过你前面几节学到的知识把他显示出来吧。
完整代码如下:
|
|
把鼠标当画笔
将要学习的函数是:cv2.setMouseCallback()
简单演示
创建一个简单的程序,会在图片上双击过的位置绘制一个圆圈。
首先来创建一个鼠标事件回调函数,但鼠标事件发生就会被执行。鼠标事件可以是鼠标上的任何动作,比如左键按下,左键松开,左键双击等。可以通过鼠标事件获得与鼠标对应的图片上的坐标。根据这些信息可以做任何想做的事。可以通过执行下列代码查看所有被支持的鼠标事件。
鼠标事件回调函数只用做一件事:在双击过的地方绘制一个圆圈。下面是代码,不懂的地方可以看看注释。
结果:
高级一点的示例
现在来创建一个更好的程序。这次的程序要完成的任务是根据选择的模式在拖动鼠标时绘制矩形或者是圆圈(就像画图程序中一样)。所以回调函数包含两部分,一部分画矩形,一部分画圆圈。这是一个典型的例子可以更好理解与构建人机交互式程序,比如物体跟踪,图像分割等。
结果:
用滑动条做调色板
• 把滑动条绑定到 OpenCV 的窗口
• 学习这些函数:cv2.getTrackbarPos(),cv2.creatTrackbar()等。
代码示例
创建一个简单的程序:通过调节滑动条来设定画板颜色。要创建一个窗口来显示显色,还有三个滑动条来设置B,G,R的颜色。
当滑动滚动条是窗口的颜色也会发生相应改变。默认情况下窗口的起始颜色为黑。
cv2.getTrackbarPos()函数的一个参数是滑动条的名字,第二个参数是滑动条被放置窗口的名字,第三个参数是滑动条的默认位置。第四个参数是滑动条的最大值,第五个函数是回调函数,每次滑动条的滑动都会调用回调函数。回调函数通常都会含有一个默认参数,就是滑动条的位置。在本例中这个函数不用做任何事情,只需要 pass 就可以了。
滑动条的另外一个重要应用就是用作转换按钮。默认情况下 OpenCV 本身不带有按钮函数。所以使用滑动条来代替。在程序中,要创建一个转换按钮,只有当装换按钮指向 ON 时,滑动条的滑动才有用,否则窗户口都是黑的。