
【OpenCV】整理记录
记录opencv的点滴
iduanbin
Stay hungry. Stay foolish
展开
-
OpenCV | PCA人脸识别
主成分分析(PCA)——Eigenfaces(特征脸)——函数:createEigenFaceRecognizer()PCA:低维子空间是使用主元分析找到的,找具有最大方差的哪个轴。缺点:若变化基于外部(光照),最大方差轴不一定包括鉴别信息,不能实行分类。程序实现了PCA的人脸识别,显示平均脸,特征脸以及重建。步骤以及解析都写在注释里面了。#include <opencv2/open...原创 2019-05-31 19:45:11 · 1583 阅读 · 0 评论 -
OpenCV | GMM 非数学角度的一点理解
一、先说一个栗子米饭的例子假如现在在食堂吃饭,找了张桌子,我打了一碗饭,往这里一坐,碗放在桌上。以俯视的角度从上往下看,此时把桌子看做坐标轴,米饭为数据点,这是在二维平面上,那么数据点是由二维坐标确定的。那么碗就可以看做GMM模型二维聚类俯视图的圈,聚类的中心点自然就是在碗里。此时的桌子、碗、米饭组成的整体,就可以称之为二维平面上的一成分高斯混合模型。这个时候,突然来了个同学,也正好端着一碗...原创 2019-05-30 16:30:50 · 319 阅读 · 0 评论 -
opencv | googlenet图像分类
#include <opencv2/opencv.hpp>#include <opencv2/dnn.hpp>#include <iostream>using namespace cv;using namespace cv::dnn;using namespace std;String model_bin_file = "bvlc_googlen...原创 2019-05-19 21:52:33 · 821 阅读 · 0 评论 -
OpenCV | CAMShift - 指定对象跟踪
文章目录一、原理介绍二、代码示例一、原理介绍CAMShift是基于MeanShift算法的基础上而来的,所以CAMShift又叫连续的自适应的MeanShift算法。MeanShift 算法如下图所示:首先在图中选取一个点作为中心点,然后得到一个窗口。然后计算窗口内所有点的均值,计算完得到一个点(图中蓝色的),然后将这个蓝色的点作为中心点又得到一个窗口。迭代若干次数后,中心的距离...原创 2019-05-04 18:16:32 · 555 阅读 · 0 评论 -
OpenCV | 稠密光流跟踪 - HF
文章目录一、API介绍二、代码演示三、结果展示一、API介绍稠密光流跟踪是将当前帧的所有像素点与前一帧比较,有变化的标记出来。对比的点比较多,不是对比变化的那几个特征点。所以速度较慢。没有稀疏光流的速度快。但有的时候效果比稀疏光流要好。calcOpticalFlowFarneback() 函数void cv::calcOpticalFlowFarneback( InputArray _pr...原创 2019-05-03 17:37:44 · 1488 阅读 · 1 评论 -
OpenCV | 稀疏光流跟踪 - KLT
文章目录一、API介绍二、代码演示三、结果展示一、API介绍稀疏光流跟踪是在图像上的当前帧与前一帧的特征点比较,有变换的就标记出来。calcOpticalFlowPyrLK() 函数void calcOpticalFlowPyrLK(InputArray prevImg, InputArray nextImg, InputArray prevPts, InputOutputArray ...原创 2019-05-03 17:28:17 · 3740 阅读 · 4 评论 -
opencv | GMM(高斯混合模型分类)-随机点分类
#include <opencv2/opencv.hpp>#include <iostream>using namespace std;using namespace cv;using namespace ml;int main(){ Mat img = Mat::zeros(500, 500, CV_8UC3); RNG rng(12345); S...原创 2019-04-18 22:23:51 · 755 阅读 · 0 评论 -
opencv GMM-高斯混合算法分割图像
#include <opencv2/opencv.hpp>#include <iostream>using namespace cv;using namespace std;using namespace ml;int main(){ Mat src = imread("D:/source/images/dlrb.png"); if (src.empty(...原创 2019-04-20 18:58:38 · 943 阅读 · 1 评论 -
opencv 绿幕背景视频抠图
文章目录一、说明二、程序实例三、结果展示一、说明在视频中采用KMeans或者GMM的算法效率太低了,用来做视频抠图效果不好,这里使用了一个更加便捷的方式。就是HSV格式。由于在视频中只有的绿色的背景和前景的人物,且将HSV归一化为:H 0 - 180S 0 - 255V 0 - 255所以在HSV格式中绿色的范围是:H 35 - 155S 43 - 255V 46 - 255...原创 2019-04-28 22:10:57 · 4930 阅读 · 1 评论 -
opencv 证件照背景替换-KMeans
文章目录一、步骤说明二、代码实例三、结果展示一、步骤说明使用了KMeans图像分割,也使用了GMM高斯混合算法,但是感觉KMeans的效果好点。整体的步骤:数据组装;KMeans分割;背景去除;遮罩生成;遮罩模糊,(视情况而定,可以不做);通道混合输出;完成。二、代码实例#include <opencv2/opencv.hpp>#include <i...原创 2019-04-28 21:54:24 · 2836 阅读 · 2 评论 -
Sift中尺度空间、高斯金字塔、差分金字塔(DOG金字塔)、图像金字塔
今天看到一个写的很好的关于SIFT和高斯金字塔的博客,必须要转载一下,哈哈哈哈~。一、 图像金字塔图像金字塔是一种以多分辨率来解释图像的结构,通过对原始图像进行多尺度像素采样的方式,生成N个不同分辨率的图像。把具有最高级别分辨率的图像放在底部,以金字塔形状排列,往上是一系列像素(尺寸)逐渐降低的图像,一直到金字塔的顶部只包含一个像素点的图像,这就构成了传统意义上的图像金字塔。获得图...转载 2019-04-24 14:26:31 · 296 阅读 · 0 评论 -
opencv Grabcut-抠图
Grabcut原理见:https://blog.youkuaiyun.com/zouxy09/article/details/8534954grabCut() 函数cv::grabCut(image, //输入图像 result, //分段结果 rectangle, // 包含前景的矩形 bgModel,fgModel, // 前景、背景 1, ...原创 2019-04-23 22:18:54 · 1836 阅读 · 0 评论 -
opencv 分水岭方法分割连在一起的硬币
文章目录一、原理二、程序实现三、结果展示四、API说明一、原理当洪水淹没所有的山头的时候,只露出山顶,这些山顶相当于marker。当洪水退去的时候,水位慢慢的下降,下降到刚好将山头都分开的山谷,这个时候就是刚好将所有山头分开的山谷。这就是分水岭分割方法。基于浸泡理论的分水岭分割方法基于连通图的方法基于距离变换的方法二、程序实现基本步骤是:输入图像 -> 灰度 -> 二...原创 2019-04-21 23:54:02 · 5155 阅读 · 0 评论 -
opencv KMeans 图像分割实例
文章目录一、原理二、函数原型三、代码实例四、运行结果一、原理(1)随机选择两个中心点;(2)计算每个点到这两个中心点的距离,最近的分成一类(连接起来);(3)重新计算中心点(平均值计算),计算新的中心点到久的中心点的差值如果小于输入的值,就说明中心的位置发生了变化,,那么到(2)步重新计算中心点到每个点的距离,开始下一次循环;(4)执行多个迭代之后,满足收敛时,得到最终的分类。如下图:...原创 2019-04-16 22:14:33 · 10035 阅读 · 4 评论 -
OpenCV | 训练识别狗的分类器过程详解
文章目录一、样本准备二、训练数据准备三、得到vec文件四、训练最终的分类器五、参数解析六、验证识别效果代码七、运行结果一、样本准备包括正样本和负样本,由于是手工准备的数据都是在百度截取的图片,所以样本不多。正样本:100个,负样本208个。正样本:都是狗的图片,尽量选背景色单一的,由于我是百度出来的图片没那么多讲究。负样本:可以是其他的除了狗的图片,我选了各种各样动物的图片。二、训练数据...原创 2019-04-09 19:49:35 · 17411 阅读 · 47 评论 -
opencv imread图片为空很可能是换行符的原因
写了个程序需要先读出图片的宽度和高度,刚开始发现读出的长宽死活都是0。后来考虑是不是因为在文件中读出路径的时候是不是有换行符,所以才导致路径不对imread的时候是空的,发现果然是这样的。#include <iostream>#include <stdlib.h>#include <stdio.h>#include <Windows.h>#...原创 2019-04-09 12:14:56 · 603 阅读 · 0 评论 -
opencv_C++ 级联分类器代码示例
文章目录一、代码示例二、结果展示一、代码示例#include <opencv2/opencv.hpp>#include <iostream>using namespace cv;using namespace std;int main(){ Mat srcImage = imread("dlrb.jpg"); Mat grayImage; cvtColo...原创 2019-03-23 15:34:23 · 606 阅读 · 0 评论 -
opencv_C++ Brisk ( Binary Robust Invariant Scalable Keypoints )特征检测与匹配
文章目录一、代码示例二、结果展示一、代码示例#include <opencv2/opencv.hpp>#include <iostream>using namespace cv;using namespace std;RNG rng(12345);void drawKeypoints_test(const vector<KeyPoint>&...原创 2019-03-23 15:32:03 · 500 阅读 · 0 评论 -
opencv_C++ AKAZE 特征提取与匹配
文章目录一、程序示例及注释二、运行结果一、程序示例及注释#include <opencv2/opencv.hpp>#include <iostream>#include <math.h>using namespace cv;using namespace std;int main(){ Mat objImage = imread("curr...原创 2019-03-18 22:50:44 · 1433 阅读 · 4 评论 -
opencv_C++ 平面对象识别与透视变换
文章目录一、需要用到的函数二、代码示例三、结果展示:一、需要用到的函数需要用到两个函数:findHomography 发现两个平面的透视变换,生成变换矩阵perspectiveTransform 透视变换还用到一个对象,DMatch 对象参数:distance:每一个mathes 的距离;trainIdx: 这个属性为我们提供了样本图像描述符列表中的描述符索引就是obj in ...原创 2019-03-13 23:18:11 · 680 阅读 · 0 评论 -
opencv_C++ FlannBasedMatcher() FLANN特征匹配
#include &lt;opencv2/opencv.hpp&gt;#include &lt;opencv2/xfeatures2d.hpp&gt;using namespace cv;using namespace std;using namespace cv::xfeatures2d;int main(){ Mat srcImage = imread("curry_dlt.j...原创 2019-03-10 21:24:51 · 10634 阅读 · 0 评论 -
opencv_C++ integral()函数 积分图计算
目录一、积分图原理二、积分图计算:cv::integral() 函数三、代码示例四、结果一、积分图原理在积分图像(Integral Image - ii)上任意位置(x, y)处的ii(x, y)表示该点左上角所有像素之和,表示如下:从给定图像I从上到下、从左到右计算得到和的积分图像公式如下:其中(x<0 || y<0) 时ii(x,y)=0, i(x,y)=0积分图像解...原创 2019-03-10 14:03:25 · 6281 阅读 · 0 评论 -
opencv_C++ LBP( Local Binary Patterns, 局部模式特征) 特征示例
理解LBP之前要先了解:LBP的原理:https://blog.youkuaiyun.com/xidianzhimeng/article/details/19634573双线性插值:https://blog.youkuaiyun.com/lxlclzy1130/article/details/50922867#include &lt;opencv2/opencv.hpp&gt;#include &lt;iostr...原创 2019-03-10 01:44:39 · 397 阅读 · 0 评论 -
opencv_C++ HOG 特征检测示例
#include &lt;opencv2/opencv.hpp&gt;#include &lt;iostream&gt;using namespace cv;using namespace std;void test(){ Mat srcImage = imread("xingren.jpg"); Mat grayImage, dstImage; cvtColor(srcI原创 2019-03-10 01:35:53 · 1257 阅读 · 0 评论 -
opencv_C++ SIFT::create( ) 函数
SIFT算法需要安装额外的扩展模块,安装步骤和注意事项见我博客:https://blog.youkuaiyun.com/qq_27396861/article/details/88095820cv::xfeatures2d::SIFT::create( int nfeatures = 0, int nOctaveLayers = 3, double constrastThreshold = 0.04...原创 2019-03-05 22:26:13 · 8766 阅读 · 1 评论 -
opencv_C++SURF特征检测示例
SURF算法需要安装额外的扩展模块,安装步骤和注意事项见我博客。SURF::create() 函数cv::xfeatures2d::SURF::create( double hessianThreshold = 100, int nOctaves = 4, int nOctaveLayers = 3, bool extended = false, bool upright =...原创 2019-03-03 23:08:37 · 2519 阅读 · 0 评论 -
opencv vs下安装扩展模块和收费模块
opencv中需要使用非免费模块和额外附加模块,如SURF,SIFT特征检测算法,就需要安装:OPENCV_EXTRA_MODULES_PATHOPENCV_ENABLE_NONFREE用Cmake安装以上两个模块,然后编译即可;这里推荐安装一篇关于以上安装的博客写的比较好的:https://blog.youkuaiyun.com/u012462822/article/details/49100025...原创 2019-03-03 22:57:23 · 3736 阅读 · 0 评论 -
opencv imread 读取数据为空,环境安装完成后
报错原因是之前安装环境的时候为了方便,将所有的lib文件都放到了附加依赖项里面,但是这是错的;这些lib里面有debug的也有release版本的,*d.lib这样的就是debug版本的。这两个版本要分开放置不要放一起,放一起会报错;debug 放只有d.lib的;release 放只有.lib的;debug版本:...原创 2019-03-03 18:42:12 · 810 阅读 · 0 评论 -
opencv_C++ - 自定义角点检测-基于Harris & Shi-Tomasi
1.基于Harris与Shi-Tomasi角点检测;2.首先通过计算矩阵M得到λ1 λ2 两个特征值根据他们得到角点响应值;3.然后自己设置阀值实现计算出阀值得到有效响应值的角点位置;自定义计算Harris角点特征值:void cv::cornerEigenValsAndVecs( InputArray src, OutputArray dst, int blockSize, in...原创 2019-03-02 22:45:44 · 409 阅读 · 0 评论 -
opencv-C++_cornerHarris()函数 角点检测
cornerHarris函数对于每一个像素(x,y)在blockSize x blockSize 邻域内,计算2x2梯度的协方差矩阵M(x,y)。就可以找出输出图中的局部最大值,即找出了角点。void cornerHarris( InputArray src, OutputArray dst, int block Size, int ksize, double k, int borderTyp...原创 2019-02-23 23:56:17 · 8099 阅读 · 3 评论 -
opencv-C++_模板匹配_matchTemplate
模板匹配不是基于直方图的,而是通过在输入图像上滑动图像块,对实际图像块和输入图像进行匹配的一种匹配方法。实现模板匹配:matchTemplate()函数用于匹配出和模板重叠的图像区域;函数原型C++void matchTemplate( InputArray image, InputArray temp1, OutputArray result, int method )【1】Inpu...原创 2019-02-23 16:47:02 · 7166 阅读 · 1 评论 -
绘制RGB三色直方图
计算直方图:calcHist()函数用于计算一个或者多个阵列的直方图。void calcHist( const Mat* images, int nimages, const int* channels, inputArray mask, OutputArray hist, int dims, const int* histSize, const float** range...原创 2019-02-20 21:03:48 · 2047 阅读 · 3 评论 -
inpaint-图像修补算法
图像的修补技术由inpaint函数实现,它可以用来从扫描的照片中清除灰尘和划痕,或者从静态图像或视屏中去除不需要的物体。函数原型C++:void inpaint( InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags )1)InputArray类型的src,输...原创 2019-02-20 11:44:41 · 7813 阅读 · 0 评论 -
查找并绘制轮廓
1.查找出轮廓,为了便于查找可以用canny边缘检测等等;2.绘制轮廓;#include <opencv2/opencv.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>using namespace cv;using namespac...原创 2019-02-18 09:53:46 · 356 阅读 · 0 评论 -
重映射:remap()函数
remap()函数会根据指定的映射形式,将原图像进行重映射几何变换,基于公式如下:dst(x, y) = src( mapx(x, y), mapy(x, y) )函数原型C++(程序 / 20):void remap( InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpola...原创 2019-02-05 21:07:23 · 9238 阅读 · 1 评论 -
函数解析:漫水填充
漫水填充有点类似于PhotoShop的魔术棒,就是基于漫水填充来实现的;在opencv2.x中有两个漫水填充算法由floodFill函数实现:第一个:int floodFill( InputOutputArray image, Point seedPoint, Scalar newVal, Rect* rect = 0, \ Scalar loDiff = Saca...原创 2019-01-26 17:14:06 · 428 阅读 · 0 评论 -
霍夫变换详细介绍
一、霍夫变换(Hough) A-基本原理一条直线可由两个点A=(X1,Y1)和B=(X2,Y2)确定(笛卡尔坐标)另一方面,也可以写成关于(k,q)的函数表达式(霍夫空间):对应的变换可以通过图形直观表示:变换后的空间成为霍夫空间。即:笛卡尔坐标系中一条直线,对应霍夫空间的一个点。反过来同样成立(霍夫空间的一条直线,对应笛卡尔坐标系的一个点):再来看看A、B两个...转载 2019-01-05 16:18:28 · 4438 阅读 · 2 评论 -
BMP 文件结构体信息
BMP 文件信息:原创 2019-01-01 11:01:56 · 1120 阅读 · 0 评论 -
图像由彩色图转化为灰度图的三种方法
分别为 加权法 均值法 最大值法1.加权法GRAY==0.3R+0.59G+0.11*B2.均值法GRAY==(R+G+B)/33.最大值法max(R,G,B)原创 2019-01-01 10:59:16 · 5938 阅读 · 0 评论 -
计算图像每行占用的字节数
在看《数字图像处理与机器视觉》这本书的时候有个计算图像每行占用的字节数,刚开始没看明白,周来琢磨的一下记录如下:#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)//计算图像每行象素所占的字节数目位图的一个像素值所占的字节数:当biBitCount=1时,8个像素占1个字节;当biBitCount=4时,2个像素占1个字节;当biBit...原创 2019-01-01 10:48:01 · 5435 阅读 · 1 评论