opencv
hanyuu11
这个作者很懒,什么都没留下…
展开
-
使用C++和opencv实现字符画视频
这个程序的核心思想是将视频的每帧作为图片处理,对每个像素的像素值,映射到某一个字符,再将所有的字符形成字符串,将每一帧对应的字符串打印出来,就可以在控制台看到动画#include <opencv2/opencv.hpp>#include <iostream>#include <Windows.h>#include<stdio.h>#include<stdlib.h>#include <mmsystem.h>#pragma原创 2021-05-14 16:37:51 · 1143 阅读 · 4 评论 -
opencv学习笔记(28):点多边形测试
概念介绍 - 点多边形测试测试一个点是否在给定的多边形内部,边缘或者外部pointPolygonTest(InputArray contour,// 输入的轮廓Point2f pt, // 测试点bool measureDist // 是否返回距离值,如果是false,1表示在内面,0表示在边界上,-1表示在外部,true返回实际距离)返回数据是double类型步骤构建一张400x400大小的图片, Mat::Zero(400, 400, CV_8UC1)画上一个六边形的闭合区域原创 2021-03-08 16:07:07 · 210 阅读 · 0 评论 -
opencv学习笔记(27):图像矩(Image Moments)
图像矩的概念和实际意义可参考https://blog.csdn.net/qq_37207090/article/details/83986950//计算矩moments(InputArray array,//输入数据bool binaryImage=false // 是否为二值图像)//计算面积contourArea(InputArray contour,//输入轮廓数据bool oriented// 默认false、返回绝对值)//计算长度arcLength(Input原创 2021-03-08 15:23:59 · 203 阅读 · 0 评论 -
opencv学习笔记(26):轮廓周围绘制矩形框和圆形框
void cv::approxPolyDP ( InputArray curve,OutputArray approxCurve,double epsilon,bool closed ) 基于RDP算法实现,目的是减少多边形轮廓点数参数curve Input vector of a 2D point stored in std::vector or MatapproxCurve Result of the approximation. The type should match原创 2021-03-08 14:51:28 · 170 阅读 · 0 评论 -
opencv学习笔记(24):轮廓发现
cv::findContours(InputOutputArray binImg, // 输入图像,非0的像素被看成1,0的像素值保持不变,8-bit OutputArrayOfArrays contours,// 全部发现的轮廓对象OutputArray, hierarchy// 图该的拓扑结构,可选,该轮廓发现算法正是基于图像拓扑结构实现。int mode, // 轮廓返回的模式int method,// 发现方法Point offset=Point()// 轮廓像素的位移,默认原创 2021-03-07 21:50:01 · 47 阅读 · 0 评论 -
opencv学习笔记(23):模板匹配(Template Match)
模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。所以模板匹配首先需要一个模板图像T(给定的子图像)另外需要一个待检测的图像-源图像S工作方法,在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。matchTemplate(InputArray image,// 源图像,必须是8-bit或者32-bit浮点数图像InputArray templ,// 模板图像,类型与输入图像一致OutputArray result,// 输出结果,必原创 2021-03-07 19:11:36 · 278 阅读 · 0 评论 -
opencv学习笔记(20):直方图计算
直方图概念是基于图像像素值,其实对图像梯度、每个像素的角度、等一切图像的属性值,我们都可以建立直方图。这个才是直方图的概念真正意义,不过是基于图像像素灰度直方图是最常见的。直方图最常见的几个属性:dims 表示维度,对灰度图像来说只有一个通道值dims=1bins 表示在维度中子区域大小划分,bins=256,划分为256个级别range 表示值得范围,灰度值范围为[0~255]之间相关APIsplit(// 把多通道图像分为多个单通道图像const Mat &src, //输入图原创 2021-03-06 21:59:33 · 74 阅读 · 0 评论 -
opencv学习笔记(18):霍夫检测(直线、圆)
霍夫直线检测Hough Line Transform用来做直线检测前提条件 – 边缘检测已经完成平面空间到极坐标空间转换对于任意一条直线上的所有点来说变换到极坐标中,从[0~360]空间,可以得到r的大小属于同一条直线上点在极坐标空(r, theta)必然在一个点上有最强的信号出现,根据此反算到平面坐标中就可以得到直线上各点的像素坐标。从而得到直线霍夫检测的具体原理https://blog.csdn.net/weixin_40196271/article/details/83346442相原创 2021-03-06 16:16:38 · 130 阅读 · 0 评论 -
opencv学习笔记(17):Canny边缘检测
Canny算法介绍Canny是边缘检测算法,在1986年提出的。是一个很好的边缘检测器很常用也很实用的图像处理方法Canny算法介绍 – 五步 in cv::Canny高斯模糊 - GaussianBlur灰度转换 - cvtColor计算梯度 – Sobel/Scharr非最大信号抑制高低阈值输出二值图像Canny算法介绍 - 非最大信号抑制Canny算法介绍-高低阈值输出二值图像T1, T2为阈值,凡是高于T2的都保留,凡是小于T1都丢弃,从高于T2的像素出发,凡是大于T1而原创 2021-03-06 10:41:06 · 91 阅读 · 0 评论 -
opencv学习笔记(16):拉普拉斯算子
理论解释:在二阶导数的时候,最大变化处的值为零即边缘是零值。通过二阶导数计算,依据此理论我们可以计算图像二阶导数,提取边缘。处理流程高斯模糊 – 去噪声GaussianBlur()转换为灰度图像cvtColor()拉普拉斯 – 二阶导数计算Laplacian()取绝对值convertScaleAbs()显示结果Laplacian(InputArray src,OutputArray dst,int depth, //深度CV_16Sint kisze, // 3double s原创 2021-03-06 09:17:46 · 203 阅读 · 0 评论 -
opencv学习笔记(15):Sobel算子
卷积应用-图像边缘提取边缘是什么 – 是像素值发生跃迁的地方,是图像的显著特征之一,在图像特征提取、对象检测、模式识别等方面都有重要的作用。如何捕捉/提取边缘 – 对图像求它的一阶导数delta = f(x) – f(x-1), delta越大,说明像素在X方向变化越大,边缘信号越强Sobel算子是离散微分算子(discrete differentiation operator),用来计算图像灰度的近似梯度Soble算子功能集合高斯平滑和微分求导又被称为一阶微分算子,求导算子,在水平和垂直两个原创 2021-03-05 23:03:06 · 344 阅读 · 0 评论 -
opencv学习笔记(14):处理边缘
卷积边界问题图像卷积的时候边界像素,不能被卷积操作,原因在于边界像素没有完全跟kernel重叠,所以当3x3滤波时候有1个像素的边缘没有被处理,5x5滤波的时候有2个像素的边缘没有被处理。处理边缘在卷积开始之前增加边缘像素,填充的像素值为0或者RGB黑色,比如3x3在四周各填充1个像素的边缘,这样就确保图像的边缘被处理,在卷积处理之后再去掉这些边缘。openCV中默认的处理方法是: BORDER_DEFAULT,此外常用的还有如下几种:BORDER_CONSTANT – 填充边缘用指定像素值原创 2021-03-05 19:55:29 · 161 阅读 · 0 评论 -
opencv学习笔记(13):自定义线性滤波
卷积是图像处理中一个操作,是kernel在图像的每个像素上的操作。Kernel本质上一个固定大小的矩阵数组,其中心点称为锚点(anchor point)卷积如何工作把kernel放到像素数组之上,求锚点周围覆盖的像素乘积之和(包括锚点),用来替换锚点覆盖下像素点值称为卷积处理。数学表达如下:常见算子robert算子sobel算子拉普拉斯算子定义算子的方式Mat robertkernelx = (Mat_<int>(2, 2) << 1, 0, 0, -1);原创 2021-03-05 18:42:01 · 56 阅读 · 0 评论 -
opencv学习笔记(12):基本阈值操作
阈值是什么?简单点说是把图像分割的标尺,这个标尺是根据什么产生的,阈值产生算法?阈值类型。(Binary segmentation)double cv::threshold ( InputArray src,OutputArray dst,double thresh,double maxval,int type)type:src是灰度图实例代码#include<opencv2/opencv.hpp>#include<iostream>using原创 2021-03-05 12:53:43 · 74 阅读 · 0 评论 -
opencv学习笔记(11):图像上采样和降采样
图像金字塔概念我们在图像处理中常常会调整图像大小,最常见的就是放大(zoom in)和缩小(zoom out),尽管几何变换也可以实现图像放大和缩小,但是这里我们介绍图像金字塔一个图像金字塔式一系列的图像组成,最底下一张是图像尺寸最大,最上方的图像尺寸最小,从空间上从上向下看就想一个古代的金字塔。高斯金字塔 – 用来对图像进行降采样拉普拉斯金字塔 – 用来重建一张图片根据它的上层降采样图片高斯金字塔是从底向上,逐层降采样得到。降采样之后图像大小是原图像MxN的M/2 x N/2 ,就是对原原创 2021-03-05 11:04:28 · 402 阅读 · 1 评论 -
opencv学习笔记(10):形态学操作应用-提取水平与垂直线
提取步骤输入图像彩色图像 imread转换为灰度图像 – cvtColor转换为二值图像 – adaptiveThreshold定义结构元素开操作 (腐蚀+膨胀)提取 水平与垂直线转换为二值图像 – adaptiveThresholdadaptiveThreshold(Mat src, // 输入的灰度图像Mat dest, // 二值图像double maxValue, // 二值图像最大值int adaptiveMethod // 自适应方法,只能其中之一 –// ADAPTIV原创 2021-03-04 20:20:01 · 92 阅读 · 1 评论 -
opencv学习笔记(9):形态学操作
膨胀跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状腐蚀腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值getStructuringElement(int shape, Size ksize, Point anchor)形状 (MORPH_RECT \MORPH_CROSS \MORPH_ELLIPSE)大小锚点 默认是Point(-1, -1)意思就原创 2021-03-04 16:16:52 · 83 阅读 · 1 评论 -
opencv学习笔记(8):图像模糊
Smooth/Blur 是图像处理中最简单和常用的操作之一使用该操作的原因之一就为了给图像预处理时候减低噪声使用Smooth/Blur操作其背后是数学的卷积计算通常这些卷积算子计算都是线性操作,所以又叫线性滤波void cv::blur ( InputArray src,OutputArray dst,Size ksize,Point anchor = Point(-1,-1),int borderType = BORDER_DEFAULT)void cv::Gaussia原创 2021-03-02 16:49:20 · 81 阅读 · 0 评论 -
opencv学习笔记(7):绘制形状和文字
Point表示2D平面上一个点x,yPoint p;p.x = 10;p.y = 8;orp = Point(10,8);Scalar表示四个元素的向量Scalar(a, b, c);// a = blue, b = green, c = red表示RGB三个通道画线void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,int thickness = 1, int lineType =原创 2021-03-02 11:46:33 · 76 阅读 · 0 评论 -
opencv学习笔记(6):调整图像亮度和对比度
图像变换可以看作如下:像素变换 – 点操作邻域操作 – 区域调整图像亮度和对比度属于像素变换-点操作重要的APIMat new_image = Mat::zeros( image.size(), image.type() ); 创建一张跟原图像大小和类型一致的空白图像、像素值初始化为0saturate_cast(value)确保值大小范围为0~255之间Mat.at(y,x)[index]=value 给每个像素点每个通道赋值实例代码#include<opencv2/open原创 2021-03-01 16:33:30 · 102 阅读 · 0 评论 -
opencv学习笔记(5):图像混合
理论-线性混合操作α取值在0,1之间void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)两张图片的大小须一致#include<opencv2/opencv.hpp>#include<iostream>#include<math.h>using namespace st原创 2021-03-01 15:54:39 · 68 阅读 · 0 评论 -
opencv学习笔记(4):图像操作
读写像素int gray = gray_src.at<uchar>(row, col);int b = dst.at<Vec3b>(row, col)[0];int g = dst.at<Vec3b>(row, col)[1];int r = dst.at<Vec3b>(row, col)[2];修改像素值Vec3b和Vec3f将输入图片转为灰度图并取反#include<opencv2/opencv.hpp>#inclu原创 2021-03-01 12:02:33 · 82 阅读 · 0 评论 -
opencv学习笔记(3):Mat对象
图像拷贝的两种方法 dst = src.clone(); src.copyTo(dst);Mat使用对象四个要点Mat对象创建定义小数组Mat Kernel = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);zeros和eye的创建Mat m2 = Mat::eye(500,500,CV_8UC1);...原创 2021-03-01 11:21:41 · 117 阅读 · 0 评论 -
opencv学习笔记(2):矩阵的掩膜操作
获取图像像素指针获取当前行指针const uchar* current = src.ptr(row);像素范围处理saturate_cast(int a)代码实现#include<opencv2/opencv.hpp>using namespace cv;int main(int argc, char** argv){ Mat src, dst; src = imread("1.jpg"); if (!src.data) { printf("could not原创 2021-02-27 11:39:20 · 86 阅读 · 0 评论 -
opencv学习笔记(1):加载、修改、保存图像
加载图像 imread显示图像namedWindow和imshow修改图像cvtColor把图像从一个色彩空间转换到另一个色彩空间保存图像imwrite保存图像到指定路径imwrite(“TESTHLS.png”,output);示例程序#include<opencv2/opencv.hpp>using namespace cv;int main(){ Mat src = imread("1.jpg"); if (!src.data) { pr原创 2021-02-27 11:30:29 · 76 阅读 · 0 评论