OpenCV简单应用(二、图像显示)

1.利用Numpy可以实现图像/视频的上下、左右颠倒操作。以下代码为4个窗口分别显示原始图、上下颠倒图、左右颠倒图、上下左右颠倒图:

import cv2
import numpy as np
#打开摄像头(只有一个摄像头则编号为0,若有2个则依次为0,1)
camera = cv2.VideoCapture(0)
#创建4个窗口
cv2.namedWindow(Original, cv2.WINDOW_NORMAL)
cv2.namedWindow(Flip UD, cv2.WINDOW_NORMAL)
cv2.namedWindow(Flip LR, cv2.WINDOW_NORMAL)
cv2.namedWindow(LR+UD, cv2.WINDOW_NORMAL)
#持续间隔1ms等待按键,若有按键跳出循环
while (cv2.waitKey(1)==-1):
    #读取摄像头数据并处理
    success, frame =camera.read()
    flip_ud=np.flipud(frame)  #上下颠倒
    flip_lr=np.fliplr(frame)  #左右颠倒
    flip_lrud=np.fliplr(flip_ud) #上下左右颠倒
    # 显示在4个窗口上
    cv2.imshow(Original, frame)
    cv2.imshow(Flip UD, flip_ud)
    cv2.imshow(Flip LR, flip_lr)
    cv2.imshow(LR+UD, flip_lrud)
#断开摄像头
camera.release()
#释放所有窗口
cv2.destroyAllWindows()

2.利用hstack,vstack可实现分屏显示,putText在图像上增添文字,代码如下:

import cv2
import numpy as np
#打开摄像头(只有一个摄像头则编号为0,若有2个则依次为0,1)
camera = cv2.VideoCapture(0)
#创建窗口
cv2.namedWindow(Webcam, cv2.WINDOW_NORMAL)
#持续间隔1ms等待按键,若有按键跳出循环
while (cv2.waitKey(1)==-1):
    #读取摄像头数据并处理,注意此处需要深拷贝(deep copy)
    success, frame =camera.read()
    original=frame.copy()
    flip_ud=np.flipud(original)
    flip_lr=np.fliplr(original).copy()
    flip_lrud=np.fliplr(flip_ud).copy()
    flip_ud=flip_ud.copy()
    #添加文字,分屏显示
    cv2.putText(original,Original,(30,50),cv2.FONT_HERSHEY_COMPLEX,1.5,(255,255,255),2)
    cv2.putText(flip_ud,Flip UD,(30,50),cv2.FONT_HERSHEY_COMPLEX,1.5,(255,255,255),2)
    cv2.putText(flip_lr,Flip LR,(30,50),cv2.FONT_HERSHEY_COMPLEX,1.5,(255,255,255),2)
    cv2.putText(flip_lrud,LR+UD,(30,50),cv2.FONT_HERSHEY_COMPLEX,1.5,(255,255,255),2)
    h1 = np.hstack((original, flip_ud))#第一行分两列
    h2 = np.hstack((flip_lr, flip_lrud))#第二行分两列
    vdisp = np.vstack((h1, h2))#显示两行
    cv2.imshow(Webcam,vdisp)
    
#断开摄像头
camera.release()
#释放所有窗口
cv2.destroyAllWindows()

3.putText( Mat& img, const string&text, Point org,int fontFace, double fontScale,Scalar color, int thickness=1, int lineType=8) 参数1:Mat& img,待写字的图片,返回值也是该值 参数2:const string& text,待写入的字符串 参数3:Point org, 第一个字符左下角坐标,格式为(x,y) 参数4:int fontFace,字体类型,FONT_HERSHEY_SIMPLEX,FONT_HERSHEY_PLAIN,FONT_HERSHEY_DUPLEX 等 参数5:double fontScale, 字体大小 参数6:Scalar color,字体颜色,格式(B,G,R) 参数7:int thickness,字体粗细 参数8:int lineType,线型,默认值为8

4.浅拷贝与深拷贝 浅拷贝:当图像之间进行赋值时,图像数据并未发生复制,两个对象指向同一块内存,改变图像2会影响图像1。"="赋值为浅拷贝。 深拷贝:当图像之间进行赋值时,图像数据发生复制,两个对象指向不同的内存,改变图像2不会影响图像1。".copy()"为深拷贝。

putText不能在上下/左右颠倒图片上执行,需利用.copy()进行深拷贝。

经验分享 程序员 微信小程序 职场和发展