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()
bitwise
OpenCV随笔的更多相关文章
- opencv随笔1
图像处理技术一般包括图像压缩,增强和复原,匹配 描述和l识别 3 个部分. 图像处理一般指数字图像处理 ( Digitallmage Processing). 其中,数字图像是指用工业相机.摄像机.扫 ...
- 转载OPENCV学习随笔
转载自 亦轩Dhc http://www.cnblogs.com/daihengchen/p/5492729.html 学习笔记:使用opencv做双目测距(相机标定+立体匹配+测距). 最近在做 ...
- OpenCV人脸识别Eigen算法源码分析
1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本 ...
- opencv的一次性配置
最近做自然场景中的文字识别,想尝试些图像处理方法,感觉每一种方法都需要自己写很麻烦,自然就想到了强大的开源的跨平台计算机视觉库OpenCv.我用的是opencv2.4.9版本,VS用的是2010,他们 ...
- opencv中stitching_detail的运行
这个拼图并非自带的直接使用sources中的代码.而是把必要的内容放到工程中,改造成自己的图像拼接.参考博文:http://www.tuicool.com/articles/fMbUfaF 该篇博文总 ...
- opencv视频播放
在一个界面上显示一张图片.是一件非常easy的事情,但说到要显示视频.刚開始学习的人可能不知道怎么处理,事实上,一般来说能够理解为视频就是图片以人眼察觉不到的速度高速更新. 曾经用摄像头採集视频显示在 ...
- Python学习--使用dlib、opencv进行人脸检测标注
参考自https://www.pyimagesearch.com/2017/04/03/facial-landmarks-dlib-opencv-python/ 在原有基础上有一部分的修改(image ...
- Android开发:Eclipse+OpenCV环境搭建
一.OpenCV预备: OpenCV是一个跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它由一系列 C 函数和少量 C++ 类构成,同时提供了Pyt ...
- python中使用Opencv进行人脸检测
这两天学习了人脸识别,看了学长写的代码,边看边码边理解搞完了一边,再又是自己靠着理解和记忆硬码了一边,感觉还是很生疏,就只能来写个随笔加深一下印象了. 关于人脸识别,首先需要了解的是级联分类器Casc ...
随机推荐
- php防注入和XSS攻击通用过滤
public function SafeFilter($arr){ $ra=Array('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/','/script/','/javas ...
- java 多线程 实现多个线程的顺序执行
场景 编写一个程序,启动三个线程,三个线程的name分别是A,B,C:,每个线程将自己的ID值在屏幕上打印5遍,打印顺序是ABCABC... 使用 synchronized 实现 public cla ...
- 获取Eureka服务列表的各种场景
一.第一类服务注册到eureka中,获取服务列表 1.基于SpringClientFactory获取服务列表 /** * <一句话功能简述> * <功能详细描述> * * @a ...
- ES6学习-0 前言
本菜鸟做了二十来年的程序开发了,前后台都写过,队伍也带过.大约是2000年左右,是用dephi 写后台CGI,所有的html,js,css基本都是混在CGI里输出到前台的,那时也没有明确的前后台的概念 ...
- Python批量图片去水印,提高工作效率
平常工作中,有时为了采用网络的一些素材,但这些素材往往被打了水印,如果我们不懂PS就无法去掉水印,或者无法批量去掉水印.这些就很影响我们的工作效率. 今天我们就一起来,用Python + OpenC ...
- MegaRAID BIOS设置阵列
MegaRAID BIOS设置阵列 1.在初始界面可以看到physical View的界面,或者在左侧的菜单栏中点击选中即可,可以看到物理磁盘. 2.点击上一步的配置向导可以进入到配置向导界面 3.选 ...
- Ansible_使用jinja2模板部署自定义文件
一.jinja2简介 1.jinja2模板 1️⃣:Ansible将jinja2模板系统用于模板文件,Ansible还使用jinja2语法来引用playbook中的变量 2️⃣:变量和逻辑表达式置于标 ...
- HDFS 高可用(HA)环境搭建
步骤一:修改公共属性配置 core-site.xml 文件 [root@node-01 ~]# cd /root/apps/hadoop-3.2.1/etc/hadoop [root@node-01 ...
- Spring IoC容器 XML 配置与加载
IoC 容器 XML 配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...
- 友盟+U-APM应用性能报告:Android崩溃率达0.32%,OPPO 、华为、VIVO 崩溃表现良好
随着信息技术高速发展,移动互联几乎已成为了一种生活方式的代名词,在全民上网的数字热潮中,如何能最大程度保障产品服务的稳定性,提供良好的用户体验,是当前企业都需要思考和亟待解决的问题.App的应用性能 ...