OpenCV随笔
创建一个窗口#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()
浙公网安备 33010602011771号