Opencv GUI相关操作

栏目: 编程工具 · 发布时间: 6年前

内容简介:值得注意的是cv2.imshow并不会阻塞程序,也就是说如果程序执行完毕,则图像窗口就会被关闭,需要结合函数cv2.waitKey来使用等待delay时间,或者按下任意按键后继续程序,并返回按键码完整示例:
Mat cv::imread    (    
const   String &     filename,
int     flags = IMREAD_COLOR 
)

第一个参数为图像路径,第二个为加载图像的模式

Opencv GUI相关操作

这里值得注意的是,当传入的图像路径是一个错误的路径时,此函数并不会抛异常,而是返回一个None值(python API)

1.2 显示图像

void cv::imshow    (    
const String &     winname, //窗口名称
InputArray     mat      //图像数据
)

值得注意的是cv2.imshow并不会阻塞程序,也就是说如果程序执行完毕,则图像窗口就会被关闭,需要结合函数cv2.waitKey来使用

int cv::waitKey    (int delay = 0)    
int cv::waitKeyEx(int delay = 0)//Similar to waitKey, but returns full key code.    

等待delay时间,或者按下任意按键后继续程序,并返回按键码

完整示例:

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

相对于imshow提供的简单图像显示方法,用的更多的是matlablip库强大的显示功能,后面更多的也是使用这个库来做一些显示的操作

import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('messi5.jpg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
plt.show()

这里要注意的是,opencv读取图像默认的通道顺序为bgr,MATLAB显示的时候默认是rgb,需要用cv2的cvtColor转换一下通道顺序再显示。

1.3 保存图像

cv2.imwrite('messigray.png',img)

2. 视频

2.1 从摄像头读取视频

opencv提供了VideoCapture工具来从摄像头读取视频,示例代码:

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()
    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

cap.read的返回值,第一个bool,标记是否正常返回帧,第二个为mat,帧数据

可以调用 cap.isOpened() 检查一下摄像头是否打开,如果为false,可以调用 cap.open() 打开摄像头

可以通过 cap.getcap.set 函数来读取,修改视频属性

virtual double cv::VideoCapture::get    (int propId)const

Opencv GUI相关操作 Opencv GUI相关操作

virtual bool cv::VideoCapture::set(int propId,double value)

例如可以用来修改视频尺寸等

2.2 从文件读取视频

import numpy as np
import cv2
cap = cv2.VideoCapture('vtest.avi')
while(cap.isOpened()):
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

2.3 保存视频

opencv提供了videoWriter函数来保存视频

cv::VideoWriter::VideoWriter    (    
const String &     filename, //文件名
int     fourcc, //编解码器配置
double     fps, //保存帧率
Size     frameSize, //视频尺寸
bool     isColor = true //正常还是灰度
)

其中,编解码器需要使用单独的函数来初始化,且是平台相关的,在 fourcc.org 上可以找到详细的说明

  • Fedora : DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID is more preferable. MJPG results in high size video. X264 gives very small size video)
  • Windows : DIVX (More to be tested and added)
  • OSX : MJPG (.mp4), DIVX (.avi), X264 (.mkv).
    获取编解码器配置值的方法,比如MJPG:
    cv2.VideoWriter_fourcc('M','J','P','G')cv2.VideoWriter_fourcc(*'MJPG')
    从摄像头读取视频并保存示例:
    import numpy as np
    import cv2
    cap = cv2.VideoCapture(0)
    # Define the codec and create VideoWriter object
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
    while(cap.isOpened()):
      ret, frame = cap.read()
      if ret==True:
          frame = cv2.flip(frame,0)
          # write the flipped frame
          out.write(frame)
          cv2.imshow('frame',frame)
          if cv2.waitKey(1) & 0xFF == ord('q'):
              break
      else:
          break
    # Release everything if job is finished
    cap.release()
    out.release()
    cv2.destroyAllWindows()

3. 绘图函数

3.1 线段

cv2.line,需要传入起点、终点、颜色、粗细

import numpy as np
import cv2
# Create a black image
img = np.zeros((512,512,3), np.uint8)
# Draw a diagonal blue line with thickness of 5 px
cv2.line(img,(0,0),(511,511),(255,0,0),5)

3.2 矩形

画矩形,传入左上角、右下角、颜色、粗细

cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)

3.3 圆形

传入圆心、半径、颜色、线段粗细,若粗细是负数,则代表填充的圆形

cv2.circle(img,(447,63), 63, (0,0,255), -1)

3.4 椭圆

椭圆参数比上面的多一些,函数定义及图示如下

void cv::ellipse    (    
InputOutputArray     img, //输入图
Point     center, //圆心坐标
Size     axes, //长轴、短轴
double     angle, 
double     startAngle,
double     endAngle,
const Scalar &     color,
int     thickness = 1,
int     lineType = LINE_8,
int     shift = 0 
)

Opencv GUI相关操作

3.5 多边形

void cv::polylines    (    
InputOutputArray     img, //输入
InputArrayOfArrays     pts, //顶点列表
bool     isClosed, //是否闭合
const Scalar &     color, //颜色
int     thickness = 1, //粗细
int     lineType = LINE_8, //线段类型
int     shift = 0 //顶点坐标中的小数位数
)
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv2.polylines(img,[pts],True,(0,255,255))

3.6 文字

void cv::putText    (    
InputOutputArray     img, //输入图
const String &     text, //文字内容
Point     org, //文字左下角坐标
int     fontFace,//字体
double     fontScale,//大小
Scalar     color,//颜色
int     thickness = 1,//线段粗细
int     lineType = LINE_8,//线段类型
bool     bottomLeftOrigin = false //为true时,文字坐标原点在左下角,否则在左上角(py版本默认左下角)
)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv2.LINE_AA)

绘图函数还有很多,详见 文档

4. 鼠标事件

通过这种方式查看opencv支持的事件名称

import cv2
events = [i for i in dir(cv2) if 'EVENT' in i]
print( events )

示例:监听鼠标双击事件,在双击的位置画一个圆

import cv2
import numpy as np
# mouse callback function
def draw_circle(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),100,(255,0,0),-1)
# Create a black image, a window and bind the function to window
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
    cv2.imshow('image',img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

一个复杂一点的示例,综合多个鼠标、键盘事件,实现画矩形或小圆点的操作

import cv2
import numpy as np
drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1
# mouse callback function
def draw_circle(event,x,y,flags,param):
    global ix,iy,drawing,mode
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix,iy = x,y
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
            if mode == True:
                cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
            else:
                cv2.circle(img,(x,y),5,(0,0,255),-1)
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        if mode == True:
            cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
        else:
            cv2.circle(img,(x,y),5,(0,0,255),-1)

img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
    cv2.imshow('image',img)
    k = cv2.waitKey(1) & 0xFF
    if k == ord('m'):
        mode = not mode
    elif k == 27:
        break
cv2.destroyAllWindows()

5. 滚动条组件

创建滚动条函数

int cv::createTrackbar    (    
const String &     trackbarname, //滚动条名称
const String &     winname,//窗口名称
int *     value, //滑块当前位置
int     count,//最大值
TrackbarCallback onChange = 0,//回调函数
void *     userdata = 0 //传给回调的用户数据
)

获取滚筒条当前值

int cv::getTrackbarPos    (    
const String &     trackbarname,
const String &     winname 
)

示例:通过滚动条创建一个调色板,并创建一个开关

import cv2
import numpy as np
def nothing(x):
    pass
# Create a black image, a window
img = np.zeros((300,512,3), np.uint8)
cv2.namedWindow('image')
# create trackbars for color change
cv2.createTrackbar('R','image',0,255,nothing)cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)
# create switch for ON/OFF functionality
switch = '0 : OFF \n1 : ON'
cv2.createTrackbar(switch, 'image',0,1,nothing)
while(1):
    cv2.imshow('image',img)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
    # get current positions of four trackbars
    r = cv2.getTrackbarPos('R','image')
    g = cv2.getTrackbarPos('G','image')
    b = cv2.getTrackbarPos('B','image')
    s = cv2.getTrackbarPos(switch,'image')
    if s == 0:
        img[:] = 0
    else:
        img[:] = [b,g,r]
cv2.destroyAllWindows()

Opencv GUI相关操作


以上所述就是小编给大家介绍的《Opencv GUI相关操作》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Code Reading

Code Reading

Diomidis Spinellis / Addison-Wesley Professional / 2003-06-06 / USD 64.99

This book is a unique and essential reference that focuses upon the reading and comprehension of existing software code. While code reading is an important task faced by the vast majority of students,......一起来看看 《Code Reading》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具