
OpenCV教程
文章平均质量分 64
铿锵的玫瑰
业余爱好者
展开
-
OpenCV入门---VS2015安装OpenCV(Nuget安装)
利用UI界面进行安装1.创建新项目,利用鼠标右键单击项目,并选择Nuget安装包管理器,具体如下所示:2.利用Nuget安装Opencv:注意,目前只有这个版本支持VS2015,也就是平台工具集可以为vs140,其他的都会报错3.测试代码#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp&g...原创 2018-10-17 22:02:17 · 1278 阅读 · 0 评论 -
OpenCV核心功能---MAT
Mat介绍OpenCV自2001年开始出现。当时,这个库是围绕一个C接口构建的,并将图像存储在内存中,它们使用了一个名为IplImage的C结构。这是您在大多数旧教程和教学材料中看到的内容。 这个问题是它带来了C语言的所有缺点。最大的问题是手动内存管理。它建立在用户负责处理内存分配和释放的假设之上。虽然这对于较小的程序来说不是问题,但是一旦你的代码库增长,处理所有这些问题将更加困难,而不是专注...原创 2018-10-17 23:12:05 · 382 阅读 · 0 评论 -
Opencv核心功能---使用OpenCV扫描图像,查找表和时间测量
测试样例通过使用无符号字符C和C ++类型进行矩阵项存储,像素通道可以具有多达256个不同的值。 对于三通道图像,这可以允许形成太多颜色(确切地说是1600万)。 使用如此多的色调可能会严重影响我们的算法性能。 在这种情况下,我们通常会减少色彩空间。 这意味着我们将颜色空间当前值除以新的输入值,最终得到更少的颜色。 例如,0到9之间的每个值都取新零值,每个值在10到19之间,值为10,依此...原创 2018-10-17 23:13:07 · 512 阅读 · 0 评论 -
Opencv核心功能---对矩阵进行掩码操作
矩阵上的掩码操作非常简单。 我们的想法是根据掩模矩阵(也称为内核)重新计算图像中的每个像素值。 此掩码包含的值将调整相邻像素(和当前像素)对新像素值的影响程度。 从数学的角度来看,我们使用指定的值进行加权平均。测试样例让我们考虑图像对比度增强方法的问题。 基本上我们想要为图像的每个像素应用以下公式:第一种表示法是使用公式,而第二种表示法是第一种使用掩码的压缩版本。 您可以通过将掩码...原创 2018-10-17 23:14:08 · 432 阅读 · 0 评论 -
Opencv核心功能---图像操作
图像的读取与输出从文件加载图像:如果您读取jpg文件,默认情况下会创建一个3通道图像。 如果您需要灰度图像,请使用:将图像写入文件中访问像素的亮度值为了获得像素亮度值,您必须知道图像的类型和通道的数量。 以下是单通道灰度图像(类型8UC1)和像素坐标x和y的示例:intensity.val [0]包含0到255之间的值。请注意x和y的顺序。 由于在OpenC...原创 2018-10-17 23:14:30 · 339 阅读 · 0 评论 -
OpenCV核心功能---使用OpenCV添加(混合)两个图像
理论一个有趣的二元(双输入)运算符是线性混合运算符:通过从0→1改变α,此运算符可用于执行两个图像或视频之间的时间交叉融合。代码#include <opencv2/opencv.hpp>#include <iostream>using namespace cv;int main( int argc, char** argv ){ double...原创 2018-10-17 23:15:16 · 290 阅读 · 0 评论 -
OpenCV核心功能---改变图像的对比度和亮度
理论图像处理一般图像处理操作符是获取一个或多个输入图像并产生输出图像的功能。 图像变换可以看作:点运算符(像素变换) 邻域(基于区域)运算像素转化在这种图像处理变换中,每个输出像素的值仅取决于相应的输入像素值(加上,可能地,一些全局收集的信息或参数)。 这种算子的例子包括亮度和对比度调整以及颜色校正和变换。亮度和对比度调整 其中i和j表示像素位于第i行和第j...原创 2018-10-17 23:15:42 · 294 阅读 · 0 评论 -
OpenCV核心功能---基本绘图
理论点它表示由其图像坐标x和y指定的2D点。 我们可以将其定义为:标量表示4元素向量。 Scalar类型在OpenCV中广泛用于传递像素值。 在本教程中,我们将广泛使用它来表示BGR颜色值(3个参数)。 如果不使用它,则没有必要定义最后一个参数。 让我们看一个例子,如果我们被要求提供颜色参数,我们将定义BGR颜色,例如:Blue = a,Green = b和Red = c。代...原创 2018-10-17 23:16:12 · 420 阅读 · 0 评论 -
OpenCV核心功能---使用OpenCV的随机生成器和文本
具体步骤(1)我们首先要做的是创建一个随机数生成器对象(RNG)RNG实现随机数生成器。 在此示例中,rng是使用值0xFFFFFFFF初始化的RNG元素(2)然后我们创建一个初始化为零的矩阵(这意味着它将显示为黑色),指定它的高度,宽度和类型(3)定义所有的图像绘制函数(4)查看函数Drawing_Random_Lines我们观察到:for循环将重复N...原创 2018-10-18 17:47:29 · 300 阅读 · 0 评论 -
Opencv核心功能---离散傅立叶变换
代码#include "opencv2/core.hpp"#include "opencv2/imgproc.hpp"#include "opencv2/imgcodecs.hpp"#include "opencv2/highgui.hpp"#include <iostream>using namespace cv;using namespace std;st...原创 2018-10-18 19:07:23 · 282 阅读 · 0 评论 -
Opencv核心功能---使用XML和YAML文件进行文件输入和输出
示例代码#include <opencv2/core/core.hpp>#include <iostream>#include <string>using namespace cv;using namespace std;static void help(char** av){ cout << endl &l...原创 2018-10-18 19:38:26 · 263 阅读 · 0 评论 -
Opencv图像处理---平滑图像
理论平滑,也称为模糊,是一种简单且经常使用的图像处理操作。 平滑的原因有很多。 在本教程中,我们将重点关注平滑以减少噪音 要执行平滑操作,我们将对图像应用滤镜。 最常见的滤波器类型是线性的,其中输出像素的值(即g(i,j))被确定为输入像素值的加权和(即f(i + k,j + 1)): 有很多种过滤器,这里我们会提到最常用的过滤器。标准化盒式过滤器这个过滤器是最简单的! 每个输出像...原创 2018-10-18 20:27:54 · 713 阅读 · 0 评论 -
Opencv图像处理---膨胀与腐蚀
理论 形态学操作将结构元素应用于输入图像并生成输出图像。 最基本的形态学操作是两个:侵蚀和膨胀。他们具有广泛的用途:消除噪音 隔离单个元素并连接图像中的不同元素。 查找图像中的强度凸起或孔膨胀该操作包括将图像A与一些内核(B)卷积,其可以具有任何形状或大小,通常是正方形或圆形。 内核B有一个定义的锚点,通常是内核的中心。 当在图像上扫描内核B时,我们计算由B重叠的最大像素值,...原创 2018-10-18 21:12:34 · 1491 阅读 · 0 评论 -
Opencv图像处理---形态操作
开运算它是通过图像的侵蚀然后膨胀获得的。 用于删除小物体(假设物体在黑暗的前景中是明亮的) 左边的图像是原始图像,右边的图像是应用开口变换后的结果。 我们可以观察到字母角落的小空间往往消失。闭运算它是通过图像的膨胀然后侵蚀而获得的。 用于去除小孔(暗区)。多形态梯度它是图像的膨胀和侵蚀之间的差异。 它可用于查找对象的轮廓,如下所示:顶帽它是输入图像与其开运算之间的差...原创 2018-10-18 21:33:32 · 217 阅读 · 0 评论 -
Opencv图像处理---提取水平线与垂直线
理论形态学是一组图像处理操作,其基于预定义的结构元素(也称为内核)来处理图像。 输出图像中的每个像素的值基于输入图像中的对应像素与其邻居的比较。 通过选择内核的大小和形状,您可以构建一个对输入图像的特定形状敏感的形态学操作。两种最基本的形态学操作是膨胀和侵蚀。 膨胀将像素添加到图像中对象的边界,而侵蚀恰恰相反。 添加或移除的像素量分别取决于用于处理图像的结构化元素的大小和形状。 一般而言,...原创 2018-10-18 22:01:20 · 2420 阅读 · 0 评论 -
Opencv图像处理---图像金字塔
理论图像金字塔图像金字塔是图像的集合 - 全部来自单个原始图像 - 它们被连续地下采样直到达到某个期望的停止点。 有两种常见的图像金字塔:高斯金字塔:用于下采样图像 拉普拉斯金字塔:用于从金字塔下方的图像重建上采样图像(分辨率较低)高斯金字塔想象金字塔是一组图层,图层越高,尺寸越小。 每个层从下到上编号,因此层(i + 1)(表示为(Gi + 1)小于层i(Gi))。 要在...原创 2018-10-18 22:22:05 · 366 阅读 · 0 评论 -
Opencv图像处理---二值化操作
理论什么是阈值?最简单的分割方法 应用示例:分离与我们要分析的对象相对应的图像区域。 该分离基于对象像素和背景像素之间的强度变化。 为了区分我们感兴趣的像素,我们执行每个像素强度值相对于阈值的比较(根据要解决的问题确定)。 一旦我们正确地分离了重要像素,我们就可以设置它们以确定它们(即我们可以为它们分配0(黑色),255(白色)或任何适合您需要的值)。阈值的类型OpenCV...原创 2018-10-18 22:51:15 · 3287 阅读 · 1 评论 -
Opencv图像处理---线性滤波器
什么是内核?内核本质上是固定大小的数值系数阵列以及该阵列中的锚点,其通常位于中心。卷积如何与内核一起工作?假设您想知道图像中特定位置的结果值。 卷积的值按以下方式计算:将内核锚点放在确定的像素上,内核的其余部分覆盖图像中相应的局部像素。 将核系数乘以相应的图像像素值并对结果求和。 将结果放在输入图像中锚点的位置。 通过在整个图像上扫描内核,对所有像素重复此过程。 代码...原创 2018-10-18 23:03:31 · 445 阅读 · 0 评论 -
Opencv图像处理---为图像增加边框
理论在本教程中,我们将简要介绍两种为图像定义额外填充(边框)的方法:BORDER_CONSTANT:用恒定值(即黑色或0)填充图像 BORDER_REPLICATE:原始边缘的行或列复制到额外边框。代码程序的运行流程 加载一张图片 让用户选择输入图像中使用哪种填充。 有两种选择: 常量值边框:为整个边框应用常量值的填充。 该值将每0.5秒随机更新一次。 ...原创 2018-10-19 15:50:09 · 3017 阅读 · 0 评论 -
Opencv图像处理---Sobel 导数
理论 最重要的卷积之一是计算图像中的导数(或它们的近似值)。 我们想要检测图像中存在的边缘。 例如: 为了更加图形化,让我们假设我们有一维图像。 边缘由下图中的“跳跃”强度显示: 如果我们采用一阶导数(实际上,这里显示为最大值),则可以更容易地看到边缘“跳跃”. 因此,根据上面的解释,我们可以推断出可以通过定位梯度高于其邻居的像素位置(或概括,高于阈值)来执行检测图像中的边缘的方法。...原创 2018-10-19 17:24:09 · 1414 阅读 · 0 评论 -
Opencv图像处理---Laplace运算
理论在边缘区域中,像素强度显示出“跳跃”或强度的高度变化。 获得强度的一阶导数,我们观察到边缘的特征是最大值,如图所示: 您可以观察到二阶导数为零! 因此,我们也可以使用此标准来尝试检测图像中的边缘。 但请注意,零不仅会出现在边缘(它们实际上可能出现在其他无意义的位置); 这可以通过在需要时应用过滤来解决。Laplacian 算子我们推断出二阶导数可用于检测边缘。 由于图像是2D,我们...原创 2018-10-19 18:34:11 · 1532 阅读 · 0 评论 -
Opencv图像处理---Canny边缘检测
理论Canny算法旨在满足三个主要标准:低错误率:意味着只检测存在的边缘。 良好的定位:必须最小化检测到的边缘像素和真实边缘像素之间的距离。 最小响应:每个边缘只有一个检测器响应。步骤过滤掉任何噪音。 高斯滤波器用于此目的。 可能使用的大小为5的高斯内核的示例如下所示: 找到图像的强度梯度。 为此,我们遵循类似Sobel的程序:应用一对卷积掩模(在x和y方向): 找到梯度强...原创 2018-10-19 18:54:49 · 730 阅读 · 0 评论 -
Opencv图像处理---Hough线变换
理论霍夫线变换是用于检测直线的变换。 为了应用变换,首先需要边缘检测预处理。它是如何工作的?图像空间中的一条线可以用两个变量表示。 例如:在笛卡尔坐标系中:参数:(m,b) 在极坐标系中:参数:(r,θ)对于霍夫变换,我们将在极坐标系统中表达线条。 因此,线方程可以写成: 通常对于每个点(x0,y0),我们可以定义经过该点的行: 如果对于给定的(x0,y0)我们绘制经过它的线...原创 2018-10-19 19:19:28 · 384 阅读 · 0 评论 -
Opencv图像处理---Hough圆检测
理论在线检测情况下,线由两个参数(r,θ)定义。 在圆圈情况下,我们需要三个参数来定义圆: 其中(xcenter,ycenter)定义中心位置(绿点),r是半径,这允许我们完全定义一个圆,如下所示: 为了提高效率,OpenCV实现了一种比标准Hough变换稍微复杂的检测方法:Hough梯度方法,它由两个主要阶段组成。 第一阶段涉及边缘检测并找到可能的圆心,第二阶段找到每个候选中心的最佳半径...原创 2018-10-19 19:39:46 · 1258 阅读 · 0 评论 -
Opencv图像处理---重映射变换
理论它是从图像中的一个位置获取像素并将它们定位在新图像中的另一个位置的过程。 为了完成映射过程,可能需要对非整数像素位置进行一些插值,因为源图像和目标图像之间不总是存在一对一的像素对应关系。 我们可以将每个像素位置(x,y)的重映射表达为: 其中g()是重映射的图像,f()是源图像,h(x,y)是对(x,y)进行操作的映射函数。 让我们以一个简单的例子来思考。 想象一下,我们有一个图像...原创 2018-10-19 21:52:30 · 994 阅读 · 0 评论 -
Opencv图像处理---仿射变换
理论任何变换都可以以矩阵乘法(线性变换)的形式表示,然后是矢量加法(平移)。 从上面,我们可以使用仿射变换来表达:旋转(线性变换) 转换(矢量加法) 比例运算(线性变换)表示仿射变换的常用方法是使用2×3矩阵。如何得到仿射变换?我们提到仿射变换基本上是两个图像之间的关系。 关于这种关系的信息大致可以通过两种方式得出:我们知道X和T,我们也知道它们是相关的。 然后我们的工作是找...原创 2018-10-19 22:24:24 · 1638 阅读 · 0 评论 -
Opencv图像处理---直方图均衡
理论什么是图像直方图?它是图像强度分布的图形表示。 它量化了所考虑的每个强度值的像素数。什么是直方图均衡?这是一种改善图像对比度的方法,以拉伸强度范围。 为了更清楚,从上面的图像中,您可以看到像素似乎聚集在可用的强度范围的中间。 直方图均衡的作用是延伸此范围。 它如何工作?均衡意味着将一个分布(给定的直方图)映射到另一个分布(更宽和更均匀的强度值分布),因此强度值在整个范围...原创 2018-10-19 22:53:12 · 281 阅读 · 0 评论 -
Opencv图像处理---直方图计算
理论什么是直方图?收集直方图,将数据计数组织成一组预定义的箱 当我们说数据时,我们并不将其限制为强度值(正如我们在前面的教程中看到的那样)。 收集的数据可以是您发现用于描述图像的任何功能。 我们来看一个例子吧。 想象一下,矩阵包含图像的信息(即强度在0-255范围内): 如果我们想要以有组织的方式统计这些数据,会发生什么? 因为我们知道这种情况下的信息值范围是256个值,所以我们可以...原创 2018-10-20 07:17:37 · 752 阅读 · 0 评论 -
OpenCV的入门---在Linux上安装OpenCV
需要的安装包Ubuntu10.04 GCC 4.4.x or later CMake 2.8.7 or higher Git GTK+2.x or higher, including headers (libgtk2.0-dev) pkg-config Python 2.6 or later and Numpy 1.5 or later with developer package...原创 2018-10-17 20:48:08 · 784 阅读 · 0 评论 -
Opencv图像处理---直方图对比
理论要比较两个直方图( and ), 首先必须要选择一个衡量直方图相似度的 对比标准 () 。 OpenCV 函数 compareHist 提供了4种对比标准来计算相似度: 代码代码流程装载一张 基准图像 和 两张 测试图像 进行对比。 产生一张取自 基准图像 下半部的图像。 将图像转换到HSV格式。 计算所有图像的H-S直方图,并归一化以便对比。 将 基准...原创 2018-10-20 07:19:52 · 940 阅读 · 1 评论 -
Opencv图像处理---反向投影
理论什么是反向投影?反向投影是一种记录给定图像中的像素点如何适应直方图模型像素分布的方式。 简单的讲, 所谓反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的该特征。 如果你有一个肤色直方图 ( Hue-Saturation 直方图 ),你可以用它来寻找图像中的肤色区域。反向投影的工作原理?假设你已经通过下图得到一个肤色直方图(Hue-Saturation)...原创 2018-10-20 07:20:32 · 869 阅读 · 0 评论 -
Opencv图像处理---模板匹配
理论实现原理 我们需要2幅图像: 原图像 (I): 在这幅图像里,我们希望找到一块和模板匹配的区域 模板 (T): 将和原图像比照的图像块 我们的目标是检测最匹配的区域: 为了确定匹配区域, 我们不得不滑动模板图像和原图像进行比较 : 对于 T 覆盖在 I 上的每个位置,你把度量值保存 到结果图像矩阵 (R) 中. 在 R 中的每个位置 都包含匹配...原创 2018-10-20 07:21:20 · 1357 阅读 · 0 评论 -
Opencv图像处理---在图像中寻找轮廓
代码#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace cv;using namespace std...原创 2018-10-20 07:22:03 · 852 阅读 · 0 评论 -
Opencv图像处理---计算物体的凸包
代码#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace cv; using namespa...原创 2018-10-20 07:23:04 · 561 阅读 · 0 评论 -
Opencv图像处理---创建包围轮廓的矩形和圆形边界框
代码#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace cv;using namespace std...原创 2018-10-20 07:23:57 · 1357 阅读 · 0 评论 -
Opencv图像处理---为轮廓创建可倾斜的边界框和椭圆
代码#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace cv;using namespace std...原创 2018-10-20 07:24:30 · 738 阅读 · 0 评论 -
Opencv图像处理---图像矩
代码#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace cv;using namespace std...原创 2018-10-20 07:25:15 · 656 阅读 · 0 评论 -
Opencv图像处理---多边形测试
代码#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace cv;using namespace std...原创 2018-10-20 07:25:52 · 576 阅读 · 0 评论 -
Opencv图像处理---基于距离变换和分水岭算法的图像分割
代码#include <opencv2/opencv.hpp>#include <iostream>using namespace std;using namespace cv;int main(int, char** argv){ // Load the image Mat src = imread(argv[1]); // Che...原创 2018-10-21 14:10:13 · 803 阅读 · 0 评论 -
Opencv媒体与GUI---为应用程序添加滑块
代码#include <cv.h>#include <highgui.h>using namespace cv;/// 全局变量的声明与初始化const int alpha_slider_max = 100;int alpha_slider;double alpha;double beta;/// 声明存储图像的变量Mat src1;Mat ...原创 2018-10-21 14:10:02 · 334 阅读 · 0 评论