主要了解包括
图像是人类视觉的基础,是自然景物的客观反映。
图像分类
如果是C++的话,可以参考这篇教程,
opencv+vs studio环境配置_addict_jun的博客-程序员宅基地_opencv_ffmpeg342_64.dll
或者直接登录Releases - OpenCV官网,然后选择一个版本,点击下载即可。
python的话,则非常简单
pip安装
pip install opencv-python == 3.4.2.17
测试
import cv2
lena = cv2.imread("1.jpg")
cv2.imshow("image",lena)
cv2.waitKey(0)
扩展
pip install opencv-contrib-python==3.4.2.17
当我们下载opencv3.x的版本时,我们经常会发现,有着opencv和opencv2两个文件夹。
opencv中还能看到OpenCV1.0最核心的头文件,可以把他们整体理解为一个大的组件。
而我们主要关注的是opencv2这个文件夹。
这里介绍几个常用的模块。
通过一个目录文件,就可以粗略的对图像领域的知识有一个大致的了解。
我个人的认为是,core模块是基础,而imgproc,gpu,ocl,video等则是辅助功能,最上层则是具体的应用了,可见3D立体匹配,图像校准,特征选择,机器学习,目标检测,去噪以及拼接等都是图像的应用领域。
那么目录的解析就到这里了,接下来是对于opencv的安装的教程。
highgui则是一个与人交互的终端,显示界面,严格上来说也算是上层应用,而作为opencv的学习,我想首先是core,然后是各类应用。辅助应用则是在应用过程中进行学习。
OpenCV
OpenCV-Python
Numpy
,配合SciPy
和Matplotlib
集成更容易。安装OpenCV之前,还可以安装
numpy,matplotlib
。OpenCV 3.4.3 以上一些经典算法因为申请了版权而不能使用,新版本有一定的限制
主要用于图像的载入、显示和输出到文件的详细分析。
python
cv.imread(img, flag)
'''
参数
-要读取的图像
-读取的标志
+ cv.IMREAD*COLOR:以彩色模式加载图片,任何图像的透明度都将被忽略。这是默认参数。
+ cv.IMREAD*GRAYSCALE:以灰度模式加载图像
+ cv.IMREAD_UNCHANGED:包括alpha通道的加载图像模式
可以使用1,0或者-1来替代上面三个标志
'''
C++
imread(const string& filename, int flags=1)
/*
参数:
+ 文件名
+ 标志位,以不同的颜色读取图片
*/
python
cv.imshow(name, img)
'''
参数
-显示图像的窗口名称,以字符串类型表示
-要加载的图像
注意:在调用显示图像API后,要调用cv.waitKey()给图像绘制留下时间,否则窗口会出现无响应情况,导致图像无法显示出来。
'''
#opencv中显示
cv.imshow("image", img)
cv.waitKey(0)
# matplotlib中展示
'''因为cv中采用BGR进行存储,这里需要转换成RGB的'''
plt.imshow(img[:,:,::-1])
plt.show()
C++
imshow(const string& winname, InputArray mat)'
/*
参数:
+ 显示窗口的名称
+ 显示的图像
*/
// 创建namedWindow()函数
// 如果只是简单使用窗口,imread和imshow就足够了,但是如果需要添加比如滑动条的创建等操作时,则需要使用namedWindow来先创建窗口。
void nameWindow(const string & winname, int flags=WINDOW_AUTOSIZE)
//创建滑动条
createTrackbar()
//滑动条的使用
int getTrackbarPos(const string& trackbarname, const string& winname)
//opencv中的鼠标操作
void setMouseVallback(conststring& winname, MouseCallback onMouse)
python
cv.imwrite(name, img)
'''
参数:
- 文件名,要保存在哪里
- 要保存的图像
'''
C++
bool imwrite(cosnt string& filename, InputArray img, const vector<int>& params=vector<int>());
基本的数据结构,Mat是oepnCV踏入2.0时代的主打,使用Mat类数据结构作为主打之后,OpenCV变得越发像需要很少编程涵养的Matlab那样,上手很方便。
基本图形的绘制
cv.line(img,start,end,color,thickness)
'''
参数
-img:要绘制直线的图像
-Start,end:直线的起点和终点
-color:线条的颜色
-Thickness:线条宽度
'''
cv.rectangle(img, leftupper, rightdown, color, thickness)
'''
参数
-img:要绘制矩形的图像
-Leftupper,rightdown:矩形的左上角和右下角坐标
-color:线条的颜色
-Thickness:线条的宽度
'''
cv.circle(img, centerpoint, r, color, thickness)
'''
参数
-img:要绘制圆形的图像
-Centerpoint,r:圆心和半径
-color:线条的颜色
-Thickness:线条的宽度,为-1时,会填充颜色
'''
如果需要在图像中添加文字
cv.putText(img, text, station, font, fontsize, color, thickness, cv.LINE_AA)
‘’’
参数
-img:图像
-text:要写入的文本数据
-station:文本的防治位置
-font:字体
-Fontsize:字体大小
‘’’
访问图像元素
这里以python做一些解释
图像的属性包括行数,列数和通道数,图像数据类型,像素数等。
img.shape
img.dtype
img.size #像素个数
图像通道的拆分与合并
有时需要在B,G,R通道图像上单独工作。在这种情况下,需要将BGR图像分割为单个通道。或者在其他情况下,可能需要将这些单独的通道合并到BGR图像。你可以通过以下方式完成。
#拆分通道
b,g,r = cv.split(img)
#通道合并
img = cv.merge((b,g,r))
色彩空间的改变
OpenCV中有150多种颜色空间转换方法。最广泛使用的转换方法有两种,BGR《》Gray和BGR《》HSV
cv.cvtColor(input_image, flag)
'''
参数
-input_image:进行颜色空间转换的图像
-flag:转换类型
+ cv.COLOR_BGR2GRAY:
+ cv.COLOR_BGR2HSV:
'''
图像的加法
可以使用OpenCV的cv.add()
函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res = img1 + img2。两个图像应该具有相同的大小和类型,或者第二个图像可以是标量值。
注意:OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加是模运算。
图像的混合
这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉
cv.addWeighted(img1, 0.7, img2, 0.3, 0)
我认为大致的体系如上图所示,数据都是底层,上层则是对数据的操作,从来都是如此。
传统的图像处理知识主要包括
源于生物学的一个分支,该分支主要研究动植物的形态和结构。而我们图像处理种的形态学,往往指的是数学形态学。
我的理解就是选择一种颜色,然后用其他颜色进行填充,就好像我们画图,画一个圈,然后把中间的白色填充为其他颜色一样。
这里首先就要引出两个概念
而图像金字塔就是图片从一个最高分辨率逐级向下递减,直到满足某个中止条件,这些多分辨率图像的集合称为图像金字塔。
简而言之,就是将超出某个阈值的像素,进行重新的定义的操作。
python设置阈值
选项 | 像素值>thresh | 其他情况 |
---|---|---|
cv2.THRESH_BINARY | maxval | 0 |
cv2.THRESH_BINARY_INV | 0 | maxval |
cv2.THRESH_TRUNC | thresh | 当前灰度值 |
cv2.THRESH_TOZERO | 当前灰度值 | 0 |
cv2.THRESH_TOZERO_INV | 0 | 当前灰度值 |
cv2.threshold(src, thresh, maxval, type[, dst])
'''
参数:
-src:灰度图片
-thresh:起始阈值
-maxval:最大值
-type:如上表的关系
'''
这步妥妥的奥运五环。
一般步骤:
canny算子
1986年开发的,是边缘检测计算理论的创立者。
sobel算子
sobel算子是一个主要用于边缘检测的离散微分算子。
Laplacian算子
该算子是n为欧几里得空间中的一个二阶微分算子,定义为梯度grad的散度div。
scharr滤波器
顾名思义,他就是一个滤波器,不过是为了配合sobel算子的运算而存在。
用于识别几何形状图形的基本方法之一。
重映射
对像素坐标进行重映射。
仿射变换
可以这样理解,主要是对图像的缩放,旋转和平移等操作的组合。
透射变换
投射变换是视角变化的结果,是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。
就是计算直方图的频数,然后对其进行平均分布。
图像特征可以分为三种
我对角点的感觉,有点类似边缘点,该点周围的区域,沿着一个方向,出现明显的亮度变化。
dst = cv.cornerHarris(src, blockSize, Ksize, k)
'''
参数
-img:数据类型为float32的输入图像
-blockSize:角点检测中要考虑的领域大小
-ksize:sobel求导使用的核大小
-k:角点检测方程中的自由参数,取值参数为【0.04,0.06】
'''
corners = cv2.goodFeaturesToTrack(image, maxcorners, qualityLevel, minDistance)
'''
参数
-image:输入灰度图像
-maxCorners:获取角点数的数目
-qualityLevel:该参数指出最低可接受的角点质量水平,在0-1之间
-minDistance:角点之间最小的欧式距离,避免得到相邻特征点
返回
-corners:搜索到的角点,在这里所有低于质量水平的角点被排除掉了。
'''
以上是10中特征检测算法
SIFT
sitf = cv.xfeatures2d.SIFT_create()
kp,des = sift.detectAndCompute(gray, None)
'''
参数
-gray:进行关键点检测的图像,注意是灰度图像
返回:
-kp:关键点信息,包括位置,尺度,方向信息
-des:关键点描述符,每个关键点对应128个梯度信息的特征向量
'''
cv.drawKeypoints(image, keypoints, outputimage, color, flags)
'''
参数:
-image:原始图像
-keypoints:关键点信息,将其绘制在图像上
-outputimage:输出图片,可以是原始图像
-color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色
-flag:绘图功能
+cv2.DRAW_MATCHES_FLAGS_DEFAULT:创建输出图像矩阵,使用现存的输出图像绘制匹配特征点,每一个关键点只绘制中间点
+cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不创建输出图像矩阵,而是在输出图像上绘制匹配对
+cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:对每一个特征点绘制带大小和方向的关键点图形
+cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINT:单点的特征点不被绘制
'''
FAST
fast = cv.FastFeatureDetector_create(threshold, nonmaxSuppression)
'''
参数
-threshold:阈值t,有默认值10
-nonmaxSuppression:是否进行非极大值抑制,默认值True
返回
-Fast:创建FastFeatureDetector对象
'''
kp = fast.detect(grayImg, None)
'''
参数
-gray:进行关键点检测的图像,注意是灰度图像
返回
-kp:关键点信息,包括位置,尺度,方向
'''
cv.drawKey(image, keypoints, outputimage, color, flags)
ORB算法
orb = cv.xfeatures2d.orb_create(nfeatures)
'''
-nfeatures:特征点的最大数量
'''
kp, dex = orb.detectAndCompute(gray,None)
'''
参数
-gray:进行关键点检测的图像,注意是灰度图像
返回
-kp:关键点
-res:描述符
'''
cv.deawKeypoints(image, keypoints, outputimage, color, flags)
随着图像领域的发展,现在feature2d往往也成为了辅助的图像处理,用于更高一层的应用,比如深度学习。最后我们在了解一下视频操作,就完成了对opencv的基础了解。
在OpenCV中我们要获取一个视频,需要创建一个VideoCapture对象,指定你要读取的视频文件
#创建读取视频的对象
cap = cv.VideoCapture(filepath)
'''
参数
-filepath:视频文件路径
'''
#获取视频的某些属性
retval = cap.get(propId)
'''
参数
-propId:从0到18的数字,每个数字表示视频的属性
'''
#修改视频的属性信息
retval = cap.set(propId, value)
#判断是否读取成功
isornot = cap.isOpened()
#获取视频的一帧图像
ret, frame = cap.read()
'''
返回
-ret:成功则返回true
-Frame:获取到的某一帧图像
'''
#显示
cv.imshow()
#释放调视频对象
cap.realease()
保存视频使用的是VedioWriter对象
out = cv2.VideoWriter(filename, fourcc, fps, frameSize)
'''
参数
-filename:视频保存的位置
-fourcc:指定视频编解码器的4字节代码
-fps:帧率
-frameSize:帧大小
'''
retval = cv2.VideoWriter_fourcc(c1, c2, c3, c4)
'''
参数
-c1,c2,c3,c4:是视频编码器的4字节代码,在fourcc.org中可以找到代码列表,与平台紧密相关
'''
主要讲解opencv的底层core以及图像基础操作和图像处理内容。
文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大
文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码
文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版
文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗
文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程
文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0
文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader
文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型
文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写
文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录
文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点
文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文