上一页 1 ··· 11 12 13 14 15 16 17 18 19 ··· 33 下一页

2013年11月16日

OpenCV学习(32) 求轮廓的包围盒

摘要: 在OpenCV中,能够很方便的求轮廓包围盒。包括矩形,圆形,椭圆形以及倾斜的矩形(包围面积最小)集中包围盒。用到的四个函数是:Rect boundingRect(InputArray points)void minEnclosingCircle(InputArray points, Point2f& center, float& radius)RotatedRect minAreaRect(InputArray points)RotatedRect fitEllipse(InputArray points)输入的参数都是轮廓,下面是程序代码:1. Rect和原型包围盒代码:nt 阅读全文

posted @ 2013-11-16 19:25 迈克老狼2012 阅读(10885) 评论(0) 推荐(0) 编辑

OpenCV学习(31) 基于defects的简单手势

摘要: 前几年在做毕业设计时候曾用opencv1.0中defects做过简单的手势识别,这几天看OpenCV2.46中的轮廓函数,发现和以前差别挺大,函数调用完全不一样,重新实现了简单手势的代码。1.首先用简单的肤色检测算法,得到手的区域。 Mat img = cv::imread("../hand2.jpg"); namedWindow("image"); imshow("image", img); Mat hsvimg; 首先把图像转化到HSV颜色空间,利用肤色色度、饱和度和亮度的特殊范围,得到手的区域。最后对得到的二值手的区域进行开闭操 阅读全文

posted @ 2013-11-16 17:43 迈克老狼2012 阅读(1833) 评论(0) 推荐(0) 编辑

OpenCV学习(30) 轮廓defects

摘要: 上一篇教程中,我们学习了如何计算轮廓的凸包,其实对一个轮廓而言,可能它的凸包和它本身是重合的,也有可能不是重合的。比如下面左边图像的轮廓本身就是凸包,而右边图像的轮廓则不是。我们可以通过函数bool isContourConvex(InputArray contour),来判定一个轮廓是否是凸包,是的话返回true,否则false[注意测试的轮廓必须是简单轮廓,没有自交叉之类的]。 对一个非凸包的轮廓而言,它包括一系列的凹陷区域,这些区域称作defect,比如下面手轮廓中,包括6个defect区域。在OpenCV中,我们用下面的结构来定义defect。struct CvConvexityDe. 阅读全文

posted @ 2013-11-16 13:01 迈克老狼2012 阅读(5137) 评论(0) 推荐(0) 编辑

2013年11月13日

OpenCV学习(29) 凸包(convexhull)

摘要: 在opencv中,通过函数convexHulll能很容易的得到一系列点的凸包,比如由点组成的轮廓,通过convexHull函数,我们就能得到轮廓的凸包。下面的图就是一些点集的凸包。求凸包的代码如下:int main( int /*argc*/, char** /*argv*/ ) { Mat img(500, 500, CV_8UC3); RNG& rng = theRNG(); cout points; //随机在1-100个点,这些点位于图像中心3/4处。 for( i = 0; i hull; convexHul... 阅读全文

posted @ 2013-11-13 21:14 迈克老狼2012 阅读(23026) 评论(0) 推荐(0) 编辑

2013年11月10日

OpenCV学习(28) 轮廓

摘要: OpenCV中可以方便的在一副图像中检测到轮廓,并把这些轮廓画出来。主要用到两个函数:一个是findContours( img, contours0, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);另一个是drawContours( cnt_img, contours, idx, color, 1, 8, hierarchy );int main( int argc, char**) { Mat img = Mat::zeros(w, w, CV_8UC1); //画6个卡通头像 for( int i = 0; i > con... 阅读全文

posted @ 2013-11-10 19:29 迈克老狼2012 阅读(2880) 评论(0) 推荐(0) 编辑

OpenCV学习(27) 直方图(4)

摘要: 我们可以利用OpenCV的直方图,backproject直方图和meanshift算法来跟踪物体。下面通过简单的例子来说明如何实现跟踪算法,我们有两幅狒狒的图片,如下图所示:我们首先在左图中框选狒狒的脸,计算出框选区域的色度(HSV空间的H)直方图,然后在image2中,backproject该直方图,得到每个像素点属于该直方图的概率图。 得到的概率图之后,我们去掉图中低饱和度的像素,然后二值化,最后对该图使用meanshift算法,得到密度最大的区域,这个区域就是我们跟踪的目标区域。注意下面去掉低饱和度像素的方法(HSV空间中的S分量表示饱和度):cv::cvtColor(image, h. 阅读全文

posted @ 2013-11-10 08:52 迈克老狼2012 阅读(1071) 评论(0) 推荐(0) 编辑

2013年11月9日

OpenCV学习(26) 直方图(3)

摘要: 本章中我们学习一下通过backproject直方图,得到一副图像中每个像素属于该直方图的概率。在下边原始图中(左图),我们框选了一块四边形的区域,计算该区域的灰度直方图,然后通过下面的函数calcBackProject,计算图像src中每个像素在直方图中的概率,最终的结果在result中,result中每个像素表示该像素在直方图中的概率,我们对得到的结果进行二值化,就得到下边右图的结果。 我们框选了一块白云区域,但从背投影结果中,海浪的边缘在直方图中的概率也很高,这是因为它们的灰度比较相似,如果我们只想白云的位置,最好使用三通道的直方图,然后背投影。 cv::calcBackProject(. 阅读全文

posted @ 2013-11-09 17:44 迈克老狼2012 阅读(1209) 评论(0) 推荐(0) 编辑

OpenCV学习(25) 直方图(2)

摘要: 在OpenCV中,也可以对三通道的图像,比如BGR,HSV等计算直方图。方法和计算单通道图像直方图相似,下面的代码描述了如何计算一个BGR三通道图像的直方图,需要注意的是,因为是三通道,每个通道取值都是[0,255],所以bin的数目达到了256*256*256,这时如果使用普通三维矩阵输出直方图结果,需要很大的空间,所以我们通常使用稀疏矩阵来保存输出结果。因为稀疏矩阵只保存非零值,这样可以节省存储空间。int main( int argc, char** argv ) { Mat src, dst; /// 打开图像 src = imread( "../lenn... 阅读全文

posted @ 2013-11-09 14:01 迈克老狼2012 阅读(781) 评论(0) 推荐(0) 编辑

2013年11月2日

OpenCV学习(24) 直方图(1)

摘要: 直方图是对数据的统计,并将统计结果分布于一系列预定义的槽中。这里的数据不仅仅指的是灰度值,它可以是任何能有效描述图像特征的数据,比如图像梯度等等。 假设有一个矩阵包含一张图像的信息 (灰度值 0-255),我们已经知道灰度值范围是0-255,假设有16个槽(bin),则有下面的划分:我们可以统计落入每个槽中像素的数目,并用直方图的形式显示出来。让我们再来了解一下直方图的一些具体细节:dims: 需要统计的特征的数目, 在上例中, dims = 1 因为我们仅仅统计了灰度值(灰度图像)。 bins: 每个特征空间 子区段 的数目,在上例中, bins = 16range: 每个特征空间的取值范. 阅读全文

posted @ 2013-11-02 14:06 迈克老狼2012 阅读(1137) 评论(0) 推荐(0) 编辑

2013年10月24日

Kmeans聚类算法分析(转帖)

摘要: 原帖地址:http://www.opencvchina.com/thread-749-1-1.html k-means是一种聚类算法,这种算法是依赖于点的邻域来决定哪些点应该分在一个组中。当一堆点都靠的比较近,那这堆点应该是分到同一组。使用k-means,可以找到每一组的中心点。当然,聚类算法并不局限于2维的点,也可以对高维的空间(3维,4维,等等)的点进行聚类,任意高维... 阅读全文

posted @ 2013-10-24 20:26 迈克老狼2012 阅读(5573) 评论(0) 推荐(2) 编辑

上一页 1 ··· 11 12 13 14 15 16 17 18 19 ··· 33 下一页

导航