引自:http://www.xuebuyuan.com/1684976.html http://blog.csdn.net/lichengyu/article/details/38392473 http://www.cnblogs.com/yemeishu/archive/2013/01/19/2867286.html谈谈NITE 2与OpenCV结合提取指尖坐标 一 概念: Convexity hull, Convexity defects 如上图所示,黑色的轮廓线为convexity hul…
一.最小外接圆 #include "opencv2/opencv.hpp" #include<iostream> using namespace std; using namespace cv; void main() { Mat srcImg = imread("E://10.png"); imshow("src", srcImg); Mat dstImg = srcImg.clone(); GaussianBlur(srcImg,…
计算轮廓面积:contourArea 函数 double contourArea(InputArray contour, bool oriented = false); contour,输入的二维点集(轮廓顶点),可以是 vector 或 Mat 类型. oriented,面向区域标识符.有默认值 false.若为 true,该函数返回一个带符号的面积值,正负取决于轮廓的方向(顺时针还是逆时针).若为 false,表示以绝对值返回. 计算轮廓长度:arcLength 函数 arcLength 函…
凸缺陷 前面我们已经学习了轮廓的凸包,对象上的任何凹陷都被成为凸缺陷.OpenCV 中有一个函数 cv.convexityDefect() 可以帮助我们找到凸缺陷.函数调用如下: hull = cv2.convexHull(cnt,returnPoints = False) defects = cv2.convexityDefects(cnt,hull) cv2.convexityDefects函数()会返回一个数组,其中每一行包含的值是 [起点,终点,最远的点,到最远点的近似距离].我们可以在…
opencv中提供findContours()函数来寻找图像中物体的轮廓,并结合drawContours()函数将找到的轮廓绘制出.首先看一下findContours(),opencv中提供了两种定义形式 官网:https://docs.opencv.org/3.3.1/d3/dc0/group__imgproc__shape.html#ga17ed9f5d79ae97bd4c7cf18403e1689a void cv::findContours ( InputOutputArray imag…
在OpenCV中,可以很方便的计算一个像素点到轮廓的距离,计算距离的函数为: double pointPolygonTest(InputArray contour, Point2f pt, bool measureDist) Parameters: contour – 输入参数轮廓. pt – 测试的点. measureDist – 如果为false的话,则函数计算符号,在轮廓外部在为-1,在轮廓内为1,在轮廓上,则为0.如果为ture,则计算实际的像素符号距离,在轮廓外的点像素距离为负值,在内…
常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标. 仿射变换在:http://blog.csdn.net/xiaowei_cqu/article/details/7616044 这位大牛的博客中已经介绍的非常清楚. 关于仿射变换的详细介绍,请见上面链接的博客. 我这里主要介绍如何在已经知道原图像中若干特征点的坐标之后,计算这些特征点进行放射变换之后的坐标,然后做一些补充. *…
#include <opencv2/opencv.hpp> #include <iostream> #include "math.h" using namespace cv; using namespace std; int main(int argc, char** argv) { Mat src = imread(); if (src.empty()) { printf("could not load image...\n"); ; }…
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat src = imread("test.jpg"); Mat src_gray,binary,dst=Mat::zeros(src.size(),CV_8UC3); if (src.empty()) { pri…
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest 效果 代码 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp>…
在OpenCV中,能够很方便的求轮廓包围盒.包括矩形,圆形,椭圆形以及倾斜的矩形(包围面积最小)集中包围盒.用到的四个函数是: Rect boundingRect(InputArray points) void minEnclosingCircle(InputArray points, Point2f& center, float& radius) RotatedRect minAreaRect(InputArray points) RotatedRect fitEllipse(Input…
OpenCV 计算图像的直方图 计算图像的直方图是图像处理领域一个非经常见的基本操作. OpenCV 中提供了 calcHist 函数来计算图像直方图.只是这个函数说实话挺难用的,研究了好久才掌握了些主要的使用方法. calcHist 函数 C++ 的函数原型例如以下: void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, SparseMat& hist, int dims, con…
Paul Viola和Michael Jones在2001年首次将积分图应用在图像特征提取上,在他们的论文"Rapid Object Detection using a Boosted Cascade of Simple Features"中,积分图被当作一种新的图像特征表征方式,可以把检测的Haar特征非常高效的计算出来,用于实时人脸检测系统. 积分图是一种能够描述全局信息的矩阵表示方法,其构造方式是积分图像上位置(i,j)处的值ii(i,j)是原图像(i,j)左上角方向所有像素的和…
利用积分图像,可以计算在某象素的上-右方的或者旋转的矩形区域中进行求和.求均值以及标准方差的计算,并且保证运算的复杂度为O(). #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; int main(int argc, char** argv) { Mat src = imread("D:/vcprojects/images/test.png", IMREAD_GRAYSCA…
boundingRect() 作用:计算点集的右上边框. 形式:boundingRect(InputArray points): 参数:points:输入二维点集,并用std::vector or Mat存储: points:输入信息,可以为包含点的容器(vector)或是Mat.返回包覆输入信息的最小正矩形.如下图: RotateRect minAreaRect(InputArray points)作用:生成最小外接矩形 points,输入信息,可以为包含点的容器(vector)或者是Mat…
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5462665.html 参考网址: http://blog.csdn.net/lichengyu/article/details/18848281 貌似还有其他的,记不清了 convolveDFT函数是从官方文档中抄录并做了修改,因为原来的程序有问题.一是输出Mat C应声明为引用:二是其中的mulSpectrums函数的第四个参数flag值没有指定,应指定为DFT_COMPLEX_OUTPUT或是D…
#include <iostream> // for standard I/O #include <string> // for strings #include <iomanip> // for controlling float print precision #include <sstream> // string to number conversion #include <opencv2/imgproc/imgproc.hpp> //…
问题描述:已知两幅图像Image1和Image2,计算出两幅图像的重叠区域,并在Image1和Image2标识出重叠区域. 算法思想: 若两幅图像存在重叠区域,则进行图像匹配后,会得到一张完整的全景图,因而可以转换成图像匹配问题. 图像匹配问题,可以融合两幅图像,得到全景图,但无法标识出在原图像的重叠区域. 将两幅图像都理解为多边形,则其重叠区域的计算,相当于求多边形的交集. 通过多边形求交,获取重叠区域的点集,然后利用单应矩阵还原在原始图像的点集信息,从而标识出重叠区域. 算法步骤: 1.图像…
提取一些经常使用的对象特征 1.长宽比 边界矩形的宽高比                                       x,y,w,h = cv2.boundingRect(cnt) aspect_ratio = floart(w)/h 2.Extent 轮廓面积与边界矩形面积的比. area = cv2.contourArea(cnt) x,y,w,h = cv2.boundingRect(cnt) rect_area = w*h extent = float(area)/rec…
#include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/features2d/features2d.hpp" //需要添加该头文件 #include <iostream> #include "Math.h&…
ApproxChains 用多边形曲线逼近 Freeman 链 CvSeq* cvApproxChains( CvSeq* src_seq, CvMemStorage* storage, int method=CV_CHAIN_APPROX_SIMPLE, double parameter=0, int minimal_perimeter=0, int recursive=0 ); src_seq 涉及其它链的链指针 storage 存储多边形线段位置的缓存 method 逼近方法 (见函数 c…
http://blog.sina.com.cn/s/blog_67a7426a0101cxl0.html 一个跟轮廓相关的最常用到的功能是匹配两个轮廓.如果有两个轮廓,如何比较它们;或者如何比较一个轮廓和另一个抽象模板. 矩 比较两个轮廓最简洁的方式是比较他们的轮廓矩.这里先简短介绍一个矩的含义.简单的说,矩是通过对轮廓上所有点进行积分运算(或者认为是求和运算)而得到的一个粗略特征.通常,我们如下定义一个轮廓的(p,q)矩: 在公式中p对应x纬度上的矩,q对应y维度上的矩,q对应y维度上的矩,阶…
引言 二值图像分析最常见的一个主要方式就是轮廓发现与轮廓分析,其中轮廓发现的目的是为轮廓分析做准备,经过轮廓分析我们可以得到轮廓各种有用的属性信息. 这里顺带提下边缘检测,和轮廓提取的区别: 边缘检测主要是通过一些手段检测数字图像中明暗变化剧烈(即梯度变化比较大)像素点,偏向于图像中像素点的变化.如canny边缘检测,结果通常保存在和源图片一样尺寸和类型的边缘图中. 轮廓检测指检测图像中的对象边界,更偏向于关注上层语义对象.如OpenCV中的findContours()函数, 它会得到每一个轮廓…
1.图像轮廓 1.1图像轮廓与API函数 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形,相对于边缘,轮廓是连续的,边缘并不全部连续.一般地,获取图像轮廓要经过下面几个步骤: 1)     读取图片. 2)     将彩色图像转换成灰度图像. 3)     将灰度图像转换成二值图形并查找其二值图像边缘即可(如canny边缘检测). 4)     显示轮廓边缘. findContours寻找轮廓函数,原型为: CV_EXPORTS_W void findContours( InputOutp…
一个跟轮廓相关的最常用到的功能是匹配两个轮廓.如果有两个轮廓,如何比较它们;或者如何比较一个轮廓和另一个抽象模板. 矩 比较两个轮廓最简洁的方式是比较他们的轮廓矩.这里先简短介绍一个矩的含义.简单的说,矩是通过对轮廓上所有点进行积分运算(或者认为是求和运算)而得到的一个粗略特征.通常,我们如下定义一个轮廓的(p,q)矩: 在公式中p对应x纬度上的矩,q对应y维度上的矩,q对应y维度上的矩,阶数表示对应的部分的指数.该计算是对轮廓边界上所有像素(数目为n)进行求和.如果p和q全为0,那么m00实际…
计算轮廓面积: double contourArea(InputArray contour, bool oriented=false ) InputArray contour:输入的点,一般是图像的轮廓点 bool oriented=false:表示某一个方向上轮廓的的面积值,顺时针或者逆时针,一般选择默认false 计算轮廓边长: double arcLength(InputArray curve, bool closed) InputArray curve:表示图像的轮廓 bool clos…
把检测出的边缘像素组装成轮廓  ——  cvFindContours OpenCV 使用内存存储器来统一管理各种动态对象的内存.内存存储器在底层被实现为一个有许多相同大小的内存块组成的双向链表 内存储器可以通过四个函数访问 : cvCreateMemStorage(创建一个内存存储器,0采用默认大小)    cvReleaseMemStorage   cvClearMemStorage(和通常释放内存的函数区别 —— 只是将释放的内存返还给内存存储器,而并不返还给系统 —— 可以重复使用内存存储…
凸缺陷,以及如何找到凸缺陷 找某一点到一个多边形的最短距离 不同形状的匹配 1.凸缺陷 前面已经设计了轮廓的凸包和凸性缺陷的概念.OpenCV中有一个函数cv2.convexityDefect()可以帮助我们找到凸缺陷: hull = cv2.convexHull(cnt,returnPoints=False)#这里必须是False defect = cv2.convexityDefects(cnt,hull) 它会返回一个数组,每一行的值为[起点,终点,最远的点,到最远点的近似距离].我们可以…
什么是轮廓? 轮廓可以简单认为成连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.轮廓在形状分析和物体的检测和识别中很有用.谈起轮廓不免想到边缘,它们确实很像.简单的说,轮廓是连续的,边缘并不全都连续(下图).其实边缘主要是作为图像的特征使用,比如可以用边缘特征可以区分脸和手,而轮廓主要用来分析物体的形态,比如物体的周长和面积等,可以说边缘包括轮廓. 为了准确,要使用二值化图像.需要进行阀值化处理或者Canny边界检测. 查找轮廓的函数会修改原始图像.如果之后想继续使用原始图像,应该将…