首页 >> 大全

OpenCV基础入门

2023-11-17 大全 28 作者:考证青年

主要了解包括

1.简介

图像是人类视觉的基础,是自然景物的客观反映。

图像分类

1.1 安装教程

如果是C++的话,可以参考这篇教程,

+vs 环境配置的博客-CSDN博客.dll

或者直接登录 - 官网,然后选择一个版本,点击下载即可。

的话,则非常简单

pip安装

pip - == 3.4.2.17

测试

import cv2
lena = cv2.imread("1.jpg")
cv2.imshow("image",lena)
cv2.waitKey(0)

扩展

pip --==3.4.2.17

1.2 目录解析

当我们下载.x的版本时,我们经常会发现,有着和两个文件夹。

中还能看到.0最核心的头文件,可以把他们整体理解为一个大的组件。

而我们主要关注的是这个文件夹。

这里介绍几个常用的模块。

通过一个目录文件,就可以粗略的对图像领域的知识有一个大致的了解。

我个人的认为是,core模块是基础,而,gpu,ocl,video等则是辅助功能,最上层则是具体的应用了,可见3D立体匹配,图像校准,特征选择,机器学习,目标检测,去噪以及拼接等都是图像的应用领域。

那么目录的解析就到这里了,接下来是对于的安装的教程。

则是一个与人交互的终端,显示界面,严格上来说也算是上层应用,而作为的学习,我想首先是core,然后是各类应用。辅助应用则是在应用过程中进行学习。

1.3 优势

-

安装之前,还可以安装numpy,。

3.4.3 以上一些经典算法因为申请了版权而不能使用,新版本有一定的限制

2 高层GUI图形用户界面

主要用于图像的载入、显示和输出到文件的详细分析。

2.1 读取图像

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)/*
参数:+ 文件名+ 标志位,以不同的颜色读取图片
*/

2.2 显示图像

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)  

2.3 保存图像

cv.imwrite(name, img)'''
参数:- 文件名,要保存在哪里- 要保存的图像
'''

C++

bool imwrite(cosnt string& filename, InputArray img, const vector<int>& params=vector<int>());

3 core核心模块

基本的数据结构,Mat是踏入2.0时代的主打,使用Mat类数据结构作为主打之后,变得越发像需要很少编程涵养的那样,上手很方便。

3.1 像素值的存储方法 3.2 常见的数据结构 3.3 绘图函数

_八宅风水学入门基础_几何数学入门基础

基本图形的绘制

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.(img, text, , font, , color, , cv.)

‘’’

参数

-img:图像

-text:要写入的文本数据

-:文本的防治位置

-font:字体

-:字体大小

‘’’

3.4 数组操作相关函数

访问图像元素

ROI感兴趣区域:使用rect矩形,range:从起始索引到中止索引。线性混合操作:前后页面切换的叠化效果计算数组加权和:()函数通道分离:split()函数通道合并:merge()函数图像对比度、亮度值调整离散傅里叶变换:简单来说就是将图像分解成正弦和余弦两个部分。以及一些二维矢量的幅值,自然对数以及矩阵归一化等数学运算。XML和YAML文件的操作

这里以做一些解释

图像的属性包括行数,列数和通道数,图像数据类型,像素数等。

img.shape
img.dtype
img.size   #像素个数

图像通道的拆分与合并

有时需要在B,G,R通道图像上单独工作。在这种情况下,需要将BGR图像分割为单个通道。或者在其他情况下,可能需要将这些单独的通道合并到BGR图像。你可以通过以下方式完成。

#拆分通道
b,g,r = cv.split(img)#通道合并
img = cv.merge((b,g,r))

色彩空间的改变

中有150多种颜色空间转换方法。最广泛使用的转换方法有两种,BGR《》Gray和BGR《》HSV

cv.cvtColor(input_image, flag)'''
参数-input_image:进行颜色空间转换的图像-flag:转换类型+ cv.COLOR_BGR2GRAY:+ cv.COLOR_BGR2HSV:
'''

图像的加法

可以使用的cv.add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res = img1 + img2。两个图像应该具有相同的大小和类型,或者第二个图像可以是标量值。

注意:加法和Numpy加法之间存在差异。的加法是饱和操作,而Numpy添加是模运算。

图像的混合

这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉

cv.addWeighted(img1, 0.7, img2, 0.3, 0)

我认为大致的体系如上图所示,数据都是底层,上层则是对数据的操作,从来都是如此。

4 图像处理 4.1 传统图像处理

传统的图像处理知识主要包括

4.1.1 三种线性滤波 4.1.2 非线性滤波 4.1.3 形态学

源于生物学的一个分支,该分支主要研究动植物的形态和结构。而我们图像处理种的形态学,往往指的是数学形态学。

4.1.4 漫水填充

我的理解就是选择一种颜色,然后用其他颜色进行填充,就好像我们画图,画一个圈,然后把中间的白色填充为其他颜色一样。

4.1.5 图像金字塔

这里首先就要引出两个概念

而图像金字塔就是图片从一个最高分辨率逐级向下递减,直到满足某个中止条件,这些多分辨率图像的集合称为图像金字塔。

4.1.5 阈值化

简而言之,就是将超出某个阈值的像素,进行重新的定义的操作。

设置阈值

选项像素值>其他情况

cv2.

cv2.

cv2.

当前灰度值

cv2.

当前灰度值

cv2.

当前灰度值

cv2.threshold(src, thresh, maxval, type[, dst])'''
参数:-src:灰度图片-thresh:起始阈值-maxval:最大值-type:如上表的关系
'''

这步妥妥的奥运五环。

4.2 图像变换 4.2.1 边缘检测

一般步骤:

canny算子

1986年开发的,是边缘检测计算理论的创立者。

sobel算子

sobel算子是一个主要用于边缘检测的离散微分算子。

算子

该算子是n为欧几里得空间中的一个二阶微分算子,定义为梯度grad的散度div。

滤波器

顾名思义,他就是一个滤波器,不过是为了配合sobel算子的运算而存在。

4.2.2 霍夫变换

用于识别几何形状图形的基本方法之一。

4.2.3 映射变换

重映射

对像素坐标进行重映射。

仿射变换

可以这样理解,主要是对图像的缩放,旋转和平移等操作的组合。

透射变换

投射变换是视角变化的结果,是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。

4.2.4 直方图均衡化

就是计算直方图的频数,然后对其进行平均分布。

5 之组件

图像特征可以分为三种

5.1 角点检测

我对角点的感觉,有点类似边缘点,该点周围的区域,沿着一个方向,出现明显的亮度变化。

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:搜索到的角点,在这里所有低于质量水平的角点被排除掉了。
'''

5.2 特征检测与匹配

以上是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)

随着图像领域的发展,现在往往也成为了辅助的图像处理,用于更高一层的应用,比如深度学习。最后我们在了解一下视频操作,就完成了对的基础了解。

6 视频操作 6.1 视频读取

在中我们要获取一个视频,需要创建一个对象,指定你要读取的视频文件

#创建读取视频的对象
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()

6.2 保存视频

保存视频使用的是对象

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中可以找到代码列表,与平台紧密相关
'''

总结

主要讲解的底层core以及图像基础操作和图像处理内容。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了