OpenCV
文章平均质量分 56
Villanelle#
这个作者很懒,什么都没留下…
展开
-
OpenCV 6.4 中值滤波器的使用
非线性滤波器前几节介绍的均值滤波器、高斯滤波器均为线性滤波器,即用邻域像素的加权累加值替换像素值。本节主要介绍非线性滤波器,其没有内核,且不能进行卷积运算,但也是通过识别邻域像素值来确定输出的像素值的。常用的非线性滤波器有中值滤波器,中值滤波器把当前像素和其邻域组成集合,计算集合的中间值作为当前像素值,它在消除椒盐噪声方面非常有效。cv::Mat image = cv::imread("salted.bmp");cv::Mat median;cv::medianBlur(image, media原创 2021-07-28 13:57:11 · 333 阅读 · 1 评论 -
OpenCV3 6.3 用滤波器进行缩减像素采样
缩减像素采样降低图像精度的过程称为缩减像素采样(downsampling),提升图像精度的过程称为提升像素采样(upsampling)。空间假频如果要缩小一幅图像,仅仅消除图像中部分行和列,再将剩余的像素拼接起来,得到的图像效果往往不尽人意。cv::Mat image = cv::imread("boldt.jpg");cv::Mat reduced1(image.rows / 4, image.cols / 4, CV_8UC3);for (int i = 0; i < reduced1原创 2021-07-28 11:07:36 · 835 阅读 · 1 评论 -
OpenCV3 6.2 低通滤波器的使用
频域、频率的概念观察图像强度值变化的频率的方法称为频域,观察灰度分布描述图像特征的方法称为空域。图像中灰度强度值变化慢的区域产生低频率,而强度值变化快的区域产生高频率,频率分为垂直频率(垂直方向上的变化)和水平频率(水平方向上的变化)。可以用傅里叶变换或余弦变换等方法显示图像的频率成分。滤波器滤波即选择性地提取图像某项方面的内容,可以放大图像中某些频段,同时滤掉其他频段的算子。滤波器可以分为低通滤波器和高通滤波器,本节中主要介绍块滤波器(box filter)和高斯滤波器(gaussian fi原创 2021-07-27 21:38:31 · 570 阅读 · 0 评论 -
OpenCV关于x,y坐标容易混淆的心得
结论凡是关于cv::Mat类的方法,索引顺序为先行后列,即先y后x。凡是关于别的类(如cv::Rect cv::Point)的方法,索引顺序为先列后列行,即我们熟悉的先x后y。先y后x的例子cv::Mat img(240, 320, CV_8U, 100); //实例化一个240行,320列的Mat类图像img.at<uchar>(j, i) = (...); //使用at方法访问第j行,第i列的像素先x后y的例子cv::Mat img(cv::Size(320, 240),原创 2021-07-25 20:46:38 · 888 阅读 · 0 评论 -
OpenCV常用方法出处链接(持续更新)
cv::absdiff原创 2021-07-22 16:33:20 · 145 阅读 · 1 评论 -
OpenCV读源码总结
1.类内函数声明后加const,即const修饰成员函数2.内联函数inline3.显示声明explicit4.类内成员函数为operator+强转数据类型名原创 2021-01-18 16:51:58 · 231 阅读 · 0 评论 -
OpenCV读源码
读OpenCV源码原创 2021-01-18 16:52:22 · 294 阅读 · 0 评论 -
OpenCV3 5.5 用分水岭算法实现图像分割
分水岭变换是一种流行的图像处理算法,用于快速将图像分割成多个同质区域。原创 2020-12-27 11:02:30 · 188 阅读 · 1 评论 -
OpenCV3 5.4 在灰度图像中应用形态学运算
形态学梯度运算和顶帽变换。原创 2020-12-26 16:25:17 · 396 阅读 · 2 评论 -
OpenCV3 5.3 用形态学滤波器开启和闭合图像
开启和闭合滤波器的定义只与基本的腐蚀和膨胀运算有关。原创 2020-12-25 22:35:02 · 323 阅读 · 0 评论 -
OpenCV3 5.2 用形态学滤波器腐蚀和膨胀图像
OpenCV中常用数学形态学分析处理离散图像,用预先定义的结构元素探测图像,从而实现图像的转换,结构元素与像素邻域的相交方式决定了运算的结果。原创 2020-12-25 22:14:09 · 256 阅读 · 0 评论 -
OpenCV3 4.9 用直方图实现视觉追踪
本例将在灰度图像中定位物体,需要在一幅图像中计算大量感兴趣区域的直方图,如果使用Histogram1D类生成直方图效率较低,故使用积分图像绘制直方图。原创 2020-12-22 16:55:17 · 346 阅读 · 1 评论 -
OpenCV3 4.8 用积分图像创建二值图
对于一张黑白纸张图片,想要提取图片中的文字部分并创建二值图有几种常见的方法:使用固定阈值、使用自适应阈值等等。下面将依次介绍各类方法的优劣。原创 2020-12-22 13:30:59 · 655 阅读 · 0 评论 -
OpenCV3 4.7 比较直方图搜索像素图像
本例仅靠比较两幅图像的直方图就测量出两幅图像的相似度,封装类后使用cv::compareHist函数来实现。原创 2020-12-21 19:24:11 · 153 阅读 · 0 评论 -
OpenCV3 4.6 用均值平移算法查找目标
均值平移算法寻找狒狒的脸部区域。原创 2020-12-21 17:21:33 · 337 阅读 · 0 评论 -
OpenCV3 4.5 反向投影直方图检测特定图像内容
根据特定感兴趣区域(ImageROI)的直方图特征,计算原图中属于各直方图箱子的概率,推断原图属于感兴趣区域的部分。原创 2020-12-21 10:55:18 · 236 阅读 · 0 评论 -
OpenCV3 4.4 直方图均衡化
很多时候图像的视觉缺陷并不是因为使用的强度值范围太窄,而是因为部分强度值的使用频率远高于其他强度值。本例引入直方图均衡化函数,即让图像直方图尽可能平稳。原创 2020-12-19 22:29:03 · 125 阅读 · 1 评论 -
OpenCV 中用cv::IMREAD_GRAYSCALE与cv::cvtColor转灰度得到灰度图不一致问题
cv::IMREAD_GRAYSCALE与cv::cvtColor转灰度得到灰度图不一致解决办法。原创 2020-12-19 21:44:09 · 10761 阅读 · 1 评论 -
OpenCV3 4.3 利用查找表修改图像外观
利用查找表对目标图像生成反向图像对于灰度图,查找表是256行1列的向量,每个值对应转换后的像素值。下面的函数建立反向查找表,对原图进行重映射得到反向图像。cv::Mat reversePixel(const cv::Mat& image){ cv::Mat lut(256, 1, CV_8UC1); cv::Mat result; for (int i = 0; i < 256; i++) { lut.at<uchar>(i)原创 2020-12-19 15:54:30 · 209 阅读 · 3 评论 -
OpenCV3 4.2计算图像直方图
计算图像直方图#include <iostream>#include <opencv2/opencv.hpp>//黑白图输出灰度直方图或彩色图输出BGR直方图专用类class Histogram1D{private: int histSize[1]; //立方图中箱子的数量 float hranges[2]; //值范围 const float* ranges[1]; //值范围的指针,用于指向值范围 int c原创 2020-12-18 10:55:34 · 265 阅读 · 0 评论 -
OpenCV3 3.5 通过色调、饱和度进行肤色检测
通过色调、饱和度进行肤色检测肤色检测领域的大量研究表明,来自不同人种人群的皮肤颜色,可以在色调-饱和度色彩空间中很好的归类,本实例仅适用色调和饱和度值来识别肤色。cv::Mat skinDetect(const cv::Mat& image, double minHue, double maxHue, double minSat, double maxSat){ //创建HSV图像 cv::Mat hsv; cv::cvtColor(image, hsv, cv::CO原创 2020-12-17 20:09:45 · 402 阅读 · 0 评论 -
OpenCV3 3.4 转换色彩空间
转换颜色表示法我们常用的数字成像的默认色彩空间是RGB,是通过加色法(红、绿、蓝)三原色组合产生色域很宽的各种颜色。但RGB并不是感知均匀的色彩空间,可能两种有较大数值差距的颜色看起来非常接近,看起来差别很大。为解决这个问题,引入具有感知均匀特性的颜色表示法,如Lab、Luv颜色空间。在OpenCV4中,用cv::cvtColor函数即可将原图像转为目标的色彩空间。//将BGR色彩空间转为Lab色彩空间cv::cvtColor(image, result, cv::COLOR_BGR2Lab);原创 2020-12-17 16:57:10 · 542 阅读 · 0 评论 -
OpenCV3 3.3 用GrabCut算法分割图像
GrabCut算法常用于从静态图像中取出前景物体,计算量很大, 但结果通常很精确int main(){ cv::Mat dva = cv::imread("newdva.jpg"); //创建包含前景的矩形区域 cv::Rect rectangle(50, 50, 470, 850); //创建分割图,内部使用的模型 cv::Mat result, bgModel, fgModel; //grabCut分割算法,参数分别为:输入图像,分割结果,包含前景原创 2020-12-17 12:43:47 · 273 阅读 · 0 评论 -
OpenCV3 3.2 用策略设计模式(封装类)比较颜色
头文件ColorDetector.h#pragma once#include<iostream>#include<opencv2/opencv.hpp>#include<vector>class ColorDetector{private: //颜色公差 int maxDist; //目标颜色 cv::Vec3b target;public: //默认构造 ColorDetector(); //有参原创 2020-12-16 16:51:40 · 278 阅读 · 0 评论 -
OpenCV3 2.8 图像重映射remap函数
#include <iostream>#include <opencv2/opencv.hpp>void wave(const cv::Mat& image, cv::Mat& result){ //映射参数 cv::Mat srcx(image.size(), CV_32F); cv::Mat srcy(image.size(), CV_32F); for (int i = 0; i < image.rows; i++原创 2020-12-15 23:42:56 · 144 阅读 · 0 评论 -
OpenCV3 2.6拉普拉斯锐化
void mySharpen(cv::Mat& image, cv::Mat& result){ result.create(image.size(), image.type()); //黑白图像 if(image.type() == CV_8UC1) { for (int i = 1; i < image.rows - 1; i++) { uchar* previous = image.ptr<uchar>(i - 1); //前一行首元素指针原创 2020-12-15 21:26:44 · 225 阅读 · 0 评论 -
OpenCV常用访问像素的几种方式
at方法//1.直接用at访问cv::Mat image = imread("dva.jpg");image.at<cv::Vec3b>(j, i) = cv::Vec3b(...); //2.使用Mat_模板子类重载()访问,需要提前知道图像类型cv::Mat_<cv::Vec3b> img(image);img(j, i) = cv::Vec3b(...);注意1:此处的(j,i)并不是坐标,是访问的第j行第i列的像素。注意2:使用at方法访问较慢,宜用于随机原创 2020-12-15 20:37:34 · 203 阅读 · 0 评论 -
Opencv中Mat矩阵乘法、dot、mul运算详解
Mat矩阵乘积——A*BOpencv重载了运算符“*”,称之为Mat矩阵乘法,其中一个重载声明为:CV_EXPORTS MatExpr operator * (const Mat& a, const Mat& b);点乘说明:A*B是以数学运算中矩阵相乘的方式实现的,即Mat矩阵A和B被当做纯粹的矩阵做乘法运算,这就要求A的列数等 于B的行数时,才能定义两个矩阵相乘。如A是m×n矩阵,B是n×p矩阵,它们的乘积AB是一个m×p矩阵。参与点乘的两个Mat矩阵的数据类型原创 2020-12-15 19:01:26 · 2531 阅读 · 0 评论 -
OpenCV图像掩码抠图
掩码mask实质上是保护区域,其黑色区不进行copyTo和setTo操作#include<opencv2/opencv.hpp>#include<iostream>using namespace std;using namespace cv; int main(){ Mat image, mask; Rect r1(100, 100, 250, 300); //设定矩形区域r1,坐标为x=100,y=100,宽250,高300 Mat i转载 2020-12-15 18:56:59 · 1272 阅读 · 0 评论 -
OpenCV中reshape方法的使用
在opencv中,reshape函数比较有意思,它既可以改变矩阵的通道数,又可以对矩阵元素进行序列化,非常有用的一个函数。函数原型:C++: Mat Mat::reshape(int cn, int rows=0) const参数比较少,但设置的时候却要千万小心。cn: 表示通道数(channels), 如果设为0,则表示保持通道数不变,否则则变为设置的通道数。rows: 表示矩阵行数。 如果设为0,则表示保持原有的行数不变,否则则变为设置的行数。首先设置一个初始矩阵:一个20行30列1通道的转载 2020-12-15 16:05:04 · 2223 阅读 · 1 评论 -
OpenCV中Mat类常用成员属性和成员方法
Mat常用成员属性data 是指向矩阵数据的uchar类指针,用*解引用后再强转为int可以读到第一个像素数据。dims 矩阵的维度,例如5*6矩阵是二维矩阵,则dims=2,三维矩阵dims=3。rows 矩阵的行数。cols 矩阵的列数。size 矩阵的大小,返回一个向量,二维矩阵即为 行数 x 列数。Mat常用成员方法channels() 矩阵元素拥有的通道数,例如常见的彩色图像,每一个像素由RGB三部分组成,则image.channels() = 3。type() 表示了矩阵原创 2020-12-15 15:57:48 · 1274 阅读 · 0 评论