opencv-python学习笔记(二)—— 图片视频读写、绘制几何形状、鼠标事件等

系列文章目录

opencv-python学习笔记(一)—— opencv介绍
opencv-python学习笔记(二)—— 图片视频读写、绘制几何形状、鼠标事件等
opencv-python学习笔记(三)—— 像素操作、几何变换、性能优化
opencv-python学习笔记(四)—— 图像处理之色彩空间、图像几何变换

文章目录

  • 系列文章目录
  • 前言
  • 一、图片读写
  • 二、视频读写
    • 1. 从相机读取视频
    • 2. 从文件读取视频
    • 3. 保存视频
  • 二、绘制几何形状
    • 1. 直线
    • 2. 矩形
    • 3. 圆
    • 4. 椭圆
    • 5. 多边形
    • 6. 文字
  • 三、鼠标画笔
    • 1. 双击画圆
    • 2. 拖动画矩形或圆
  • 四、Trackbar

前言

在这里,你将学习如何显示和保存图像和视频,控制鼠标事件和创建trackbar。

一、图片读写

从文件中读取图像(使用cv::imread)

在OpenCV窗口中显示图像(使用cv::imshow)

将一个图像写入一个文件(使用cv::imwrite)
代码:

import cv2 as cv
import sys
img = cv.imread(cv.samples.findFile("starry_night.jpg"))	# 读
if img is None:
    sys.exit("Could not read the image.")
cv.imshow("Display window", img)	# 显示
k = cv.waitKey(0)
if k == ord("s"):
    cv.imwrite("starry_night.png", img)	# 保存

结果:

二、视频读写

1. 从相机读取视频

有时候需要用摄像机捕捉实时视频流。OpenCV提供了一个非常简单的接口来实现这一点。让我们从摄像头(我正在使用笔记本电脑上的内置摄像头)获取一个视频,将其转换为灰度视频并显示出来。

为了获取视频,你需要创建一个videoccapture对象。它的参数可以是设备索引值或视频文件的名称。设备索引值用来指定要连接的相机。通常如果只连接了一个摄像头。则传递0(或-1),如果有第二个相机,则可以通过传递1来选择第二个相机,以此类推。然后可以逐帧获取数据。但在最后,别忘了释放VideoCapture。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
    print("Cannot open camera")
    exit()
while True:
    # Capture frame-by-frame
    ret, frame = cap.read()
    # if frame is read correctly ret is True
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    # Our operations on the frame come here
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # Display the resulting frame
    cv.imshow('frame', gray)
    if cv.waitKey(1) == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()

cap.read()返回bool (True/False)。如果帧被正确读取,它将为True。你可以通过检查这个返回值来检查是否正确读取。

有时,cap可能没有初始化成功。在这种情况下,此代码将报错。可以通过cap.isOpened()方法检查它是否初始化成功。

可以通过cap.get(cv.CAP_PROP_FRAME_WIDTH)和cap.get(cv.CAP_PROP_FRAME_HEIGHT)获取每一帧的宽度和高度。默认为640x480。如果想把它改成320x240。只需使用ret=cap.set(cv.CAP_PROP_FRAME_WIDTH,320)和ret = cap.set(cv.CAP_PROP_FRAME_HEIGHT,240)。

2. 从文件读取视频

从文件中获取视频和从相机中获取视频类似,只需要将摄像机索引值更改为视频文件名。
使用cv.waitKey()可以控制视频播放的速度,一般为25ms即可。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture('vtest.avi')
while cap.isOpened():
    ret, frame = cap.read()
    # if frame is read correctly ret is True
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    cv.imshow('frame', gray)
    if cv.waitKey(1) == ord('q'):
        break
cap.release()
cv.destroyAllWindows()

3. 保存视频

下面的代码读取摄像机,并翻转每一帧,然后保存视频。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640,  480))
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    frame = cv.flip(frame, 0)
    # write the flipped frame
    out.write(frame)
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()

二、绘制几何形状

用OpenCV绘制不同的几何形状。

1. 直线

要画一条直线,需要传递直线的起始和结束坐标。我们将创建一个黑色的图像,并在它上面从左上角到右下角画一条蓝线。

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

2. 矩形

要画一个矩形,需要矩形的左上角和右下角。这次我们将在图像的右上角绘制一个绿色矩形。

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

3. 圆

要画一个圆,需要它的圆心坐标和半径。我们将在上面画的矩形内画一个圆。

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

4. 椭圆

要绘制椭圆,我们需要传递几个参数。一个参数是中心位置(x,y)。下一个参数是轴长度(长轴长度,短轴长度)。angle是椭圆逆时针方向的旋转角。startAngle和endAngle表示从长轴顺时针方向测量的椭圆弧的起始和结束。下面的例子在图像的中心画了一个半椭圆。

cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)

5. 多边形

要画一个多边形,首先需要指定多边形的顶点坐标。在这里,我们用黄色画一个有四个顶点的小多边形。

pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255))

注意:如果第三个参数为False,得到是连接所有点的折线,而不是一个封闭的形状

6. 文字

font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)

效果:

opencv-python学习笔记(二)—— 图片视频读写、绘制几何形状、鼠标事件等_第1张图片

三、鼠标画笔

1. 双击画圆

创建了一个简单的应用程序,在双击图像的任何位置上绘制一个圆。

import numpy as np
import cv2 as cv
# mouse callback function
def draw_circle(event,x,y,flags,param):
    if event == cv.EVENT_LBUTTONDBLCLK:
        cv.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)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
    cv.imshow('image',img)
    if cv.waitKey(20) & 0xFF == 27:
        break
cv.destroyAllWindows()

opencv-python学习笔记(二)—— 图片视频读写、绘制几何形状、鼠标事件等_第2张图片

2. 拖动画矩形或圆

通过拖动鼠标绘制矩形或圆形(取决于我们选择的模式)
这个具体的例子将真的有助于创建和理解一些交互式应用程序,如目标跟踪,图像分割等。

import numpy as np
import cv2 as cv
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 == cv.EVENT_LBUTTONDOWN:
        drawing = True
        ix,iy = x,y
    elif event == cv.EVENT_MOUSEMOVE:
        if drawing == True:
            if mode == True:
                cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
            else:
                cv.circle(img,(x,y),5,(0,0,255),-1)
    elif event == cv.EVENT_LBUTTONUP:
        drawing = False
        if mode == True:
            cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
        else:
            cv.circle(img,(x,y),5,(0,0,255),-1)
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
    cv.imshow('image',img)
    k = cv.waitKey(1) & 0xFF
    if k == ord('m'):
        mode = not mode
    elif k == 27:
        break
cv.destroyAllWindows()            

opencv-python学习笔记(二)—— 图片视频读写、绘制几何形状、鼠标事件等_第3张图片

四、Trackbar

创建一个应用程序:颜色显示窗口和三个跟踪条来指定B、G、R颜色。滑动跟踪栏,相应的窗口颜色就会改变。

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

opencv-python学习笔记(二)—— 图片视频读写、绘制几何形状、鼠标事件等_第4张图片

你可能感兴趣的:(#,OpenCV)