OpenCV随笔
阅读原文时间:2023年07月11日阅读:2

创建一个窗口#zeros(shape,dtype=float,order='C')
#shape:形状,dtype:数据类型,可选参数,默认numpy.float64img = np.zeros((500,500,3),np.uint8)

读取图片:

img=cv.imread('图片路径',flag);——彩色一般都是原图

flag=-1时,8位深度,原通道——原图

flag=0,8位深度,1通道——黑白

flag=1,   8位深度  ,3通道(彩色)

flag=2,原深度,1通道——黑白

flag=3,  原深度,3通道(彩色)

flag=4,8位深度 ,3通道(彩色)

获取音频文件:

cap = cv2.VideoCapture("2.avi")

新建窗口:cv.nameWindow();的方法

void nameWindow(const string& winname,int flags = WINDOW_AUTOSIZE) ;

参数1:新建的窗口的名称。自己随便取。

参数2:窗口的标识,一般默认为WINDOW_AUTOSIZE 。

WINDOW_AUTOSIZE 窗口大小自动适应图片大小,并且不可手动更改。(上面图1就是使用的它)

WINDOW_NORMAL 用户可以改变这个窗口大小(上面图2就是使用的它)

WINDOW_OPENGL 窗口创建的时候会支持OpenGL
滑动控件的创建:

cv2.createTrackbar('Weighted','Combine',50,100,OnAddWeighted)

参数一、trackbarname:滑动空间的名称;

参数二、winname:滑动空间用于依附的图像窗口的名称(一般是nameWindow的名称);

参数三、value:初始化阈值;

参数四、count:滑动控件的刻度范围;

参数五、TrackbarCallback是回调函数

按位(bitwise)运算及模板(mask)理解:

举个与运算 例子(and):#相与,如果mask模板是255则为255,否者为原色。通俗理解:若模板为黑色,则该部分为黑,否则为参考图的颜色。

图片对比度转换:

gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#转为灰度图 0则正常
gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)#转到HSV空间

写入字体#设置字体类型:

FONT_HERSHEY_SIMPLEX,FONT_HERSHEY_PLAIN,FONT_HERSHEY_DUPLEX
font1 = cv2.FONT_HERSHEY_SIMPLEX
font2 = cv2.FONT_HERSHEY_PLAIN
font3 = cv2.FONT_HERSHEY_DUPLEX
#背景图片,待写入的字,第一个字符左下角坐标,字体类型,字体大小,字体颜色,字体粗细
cv2.putText(img,'OpenCV',(20,100),font1,2,(255,0,0),5)
直线
#背景图,起点左边,终点坐标,线条颜色,线条宽度,[线条类型]
##线条类型:默认是8-connected样式,anti-aliased线条,cv2.LINE_AA表示反锯齿线条,曲线视觉效果更佳

cv2.line(img,(0,0),(300,300),(0,255,0),3)


#背景图,圆心位置,圆半径,圆颜色,[圆粗细,圆边界类型]

cv2.circle(img,(200,200),30,(0,0,255))

椭圆
#背景图,中心坐标,长短轴,顺时针旋转角度,顺时针起始角度,终止角度,线条颜色,线条粗细,[线条类型]

cv2.ellipse(img,(200,200),(170,130),0,0,360,(255,0,0),3)

矩形框

#背景图片,左上角,右下角,BGR,矩形框边框厚度,[边缘折线类型]
cv2.rectangle(img,(10,10),(200,200),(0,255,0),-1, cv2.LINE_AA)

绘制多边形

#将数组转化为矩阵
#数组,[数据类型]
pts = np.array([[50,50],[250,50],[250,250],[50,250]],np.int32)

多边形边框

#背景图片,顶点集合,是否是闭合折线,折线颜色,折线粗细,[折线类型]
cv2.polylines(img,[pts],True,(255,0,0),6,cv2.LINE_AA)

多边形内填充

#背景图片,顶点集合,填充颜色,[边缘折线类型]
cv2.fillPoly(img,[pts],(0,255,0),cv2.LINE_AA)

鼠标事件回调函数(鼠标响应函数)void 函数名(int event,int X,int Y,int flags,void* param)
#鼠标事件类型,X和Y为事件发生时鼠标坐标,按下鼠标的哪个键,指向任意对象的指针void screenShot(event,x,y,flags,param)
处理鼠标动作函数 void setMousecallback(winname,onMouse, [void* userdata=0])
#窗口名,鼠标响应函数,传给回调函数的参数cv2.setMousecallback("窗口名",鼠标相应函数名)
鼠标事件类型
EVENT_MOUSEMOVE              滑动EVENT_LBUTTONDOWN          左键点击
EVENT_RBUTTONDOWN          右键点击
EVENT_MBUTTONDOWN          中键点击
EVENT_LBUTTONUP                 左键放开
EVENT_RBUTTONUP                 右键放开
EVENT_MBUTTONUP                 中键放开
EVENT_LBUTTONDBLCLK          左键双击
EVENT_RBUTTONDBLCLK         右键双击
EVENT_MBUTTONDBLCLK         中键双击

在图上画图形(或者截图):

# -*- coding: cp936 -*-
import cv2
import numpy as np

flag = False
x1=y1=0

##Alt+3
def screenShot(event,x,y,flags,param):
global x1,y1,flag,img,temp
if event==cv2.EVENT_LBUTTONDOWN: #鼠标左键按下
flag = True #表示当前鼠标左键是按下的
x1 = x
y1 = y
elif event==cv2.EVENT_MOUSEMOVE: #鼠标移动
#鼠标移动的时候一直运行下面这个,所以会保留最后一次画的圆
if(flag):
img = temp.copy()#调用temp中的图
#cv2.rectangle(img,(x1,y1),(x,y),(0,255,0),2)
cv2.circle(img,((x1+x)//2,(y1+y)//2),abs((x-x1)//2),(0,0,255),2)
'''
cvCircle(CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1,
int lineType=8, int shift=0)
img为源图像指针
center为画圆的圆心坐标
radius为圆的半径
color为设定圆的颜色,规则根据B(蓝)G(绿)R(红)
thickness 如果是正数,表示组成圆的线条的粗细程度。否则,-1表示圆是否被填充
line_type 线条的类型。默认是8
shift 圆心坐标点和半径值的小数点位数
'''
elif event==cv2.EVENT_LBUTTONUP: #鼠标左键弹起
flag = False #弹起使画圆结束
temp = img.copy()#画完的图保存到temp中
#ROI = temp[y1:y,x1:x] #---y1:y2, x1:x2
#cv2.imshow('ROI',ROI)
#cv2.imwrite('ROI.bmp',ROI)

cv2.rectangle(img,(x1,y1),(x,y),(0,255,0),2)

img=cv2.imread('1.jpg') #读取图像

temp = img.copy() #备份img图

cv2.namedWindow('screenShot1')#生成的窗口名

#鼠标操作信息回调函数
cv2.setMouseCallback('screenShot1',screenShot)#将screenShot画圆函数回调到窗口中

while(1):
cv2.imshow('screenShot1',img)#将图片展现窗口
if cv2.waitKey(1)&0xFF==27: #Esc按下退出
break
cv2.destroyAllWindows()

实现雪花效果:

# -*- coding: cp936 -*-
import cv2
import numpy as np
import random #随机数模块
img=cv2.imread('1.jpg') #读取图像

#print img.shape
#实现雪花效果
for num in range(0,300): #控制雪花点个数
i = random.randint(0,img.shape[0])%img.shape[0]
j = random.randint(0,img.shape[1])%img.shape[1]
#img[i,j] = [0, 0, 255]
cv2.circle(img,(j,i),2,(255,255,255),-1)

cv2.imshow('src',img)
cv2.imwrite('snow.jpg',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

分解视频:

# -*- coding: utf-8 -*-

import cv2

cap = cv2.VideoCapture("2.avi")

flag = 0

if(cap.isOpened()): #视频打开成功
flag = 1
else:
flag = 0
#print "read error!"
i=0
imgPath = ""

if(flag==1):
while(True):
ret,frame = cap.read()#读取一帧
#if(frame is None):
if ret==False: #读取帧失败
break
#gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#转为灰度图 0则正常
#gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)#转到HSV空间
i=i+1
imgPath = "D:\\pic\\"+str(i)+".bmp"
cv2.imshow("frame", frame)
#cv2.imwrite(imgPath,frame)#截取的帧写入路径文件
if cv2.waitKey(50)&0xFF ==27: #按下Esc键退出
#cv2.imwrite("1.bmp",frame)
break

cap.release()
cv2.destroyAllWindows()

自定义颜色条:

# -*- coding: cp936 -*-
import cv2
import numpy as np

def nothing(x):
pass
img=np.zeros((300,512,3),np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R','image',0,255,nothing)
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)
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
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]#OpenCV存储颜色顺序是BGR
cv2.destroyAllWindows()

图片重叠度:

# -*- coding: cp936 -*-
import cv2
import numpy as np

def OnAddWeighted(weightValue):#图像混合
global img,img2,dst #全局变量
dst = cv2.addWeighted(img1,float(weightValue)/100,img2,float(100-weightValue)/100,0)#按权重混合叠加
img1 = cv2.imread('1.jpg') #加载第一张图片
img2 = cv2.imread('2.jpg') #加载第二张图片
dst = np.zeros(img1.shape,np.uint8) #结果图像定义

cv2.namedWindow('Combine')
cv2.createTrackbar('Weighted','Combine',50,100,OnAddWeighted)
OnAddWeighted(50) #初始调用

while(1):
cv2.imshow('Combine',dst)#显示结果图
k=cv2.waitKey(1)&0xFF
if k==27:
break

cv2.destroyAllWindows()

实现图片重叠(涉及图片【bitwise】按位计算):

# -*- coding: cp936 -*-
import numpy as np
import cv2
#获取car图并且放在src幕布上
img = cv2.imread('1 (1).jpg')
cv2.imshow('src',img)

#获取logo图并且放在src幕布上
logo1 = cv2.imread('3.png')
logo = cv2.resize(logo1,(200,200))#--将图片改为200x200大小
cv2.imshow('logo',logo)

w = logo.shape[1] #--logo宽度

h = logo.shape[0] #--logo高度

gray = cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY)#logo转为灰度图

cv2.imshow('gray',gray) #显示灰度图

ret, mask1 = cv2.threshold(gray, 175, 255, cv2.THRESH_BINARY_INV)#将gray二值化,转成黑白图

cv2.imshow('mask', mask1)
#相与,如果mask模板是255则为255,否者为原色。

logo_temp = cv2.bitwise_and(logo, logo, mask=mask1) #将logo和mask 相与

cv2.imshow('logo_temp',logo_temp)

roi = img[0:h,0:w] #---y1:y2,x1:x2

mask1_inv = cv2.bitwise_not(mask1)#翻转,白变黑,黑变白

cv2.imshow('mask2',mask1_inv)

roi_temp = cv2.bitwise_and(roi, roi, mask=mask1_inv)#将mask2和原图roi区间 相与

cv2.imshow('roi_temp',roi_temp)

dst = cv2.add(logo_temp, roi_temp)#
cv2.imshow('result',dst)
print(dst)

img[0:h,0:w] = dst

cv2.imshow('result',img)

cv2.waitKey(0)
cv2.destroyAllWindows()

bitwise