opencv轮廓提取_opencv轮廓提取中心点 - CSDN
精华内容
参与话题
  • 利用OpenCV提取目标轮廓

    千次阅读 2012-03-26 09:44:59
    一个简单的提取飞机目标图像(二值图)轮廓的程序  #include  #include  #include  #include  IplImage* g_image = NULL;  IplImage* g_gray =NULL;  int g_thresh = 100;  CvMemStorage* g_...
    一个简单的提取飞机目标图像(二值图)轮廓的程序

        #include <cv.h>
        #include <highgui.h>
        #include <iostream.h>
        #include <stdio.h>
        IplImage* g_image = NULL;
        IplImage* g_gray =NULL;
        int g_thresh = 100;
        CvMemStorage* g_storage = NULL;
        char name[1][80];
        int Presskey;
        int main( int argc, char** argv )
        {
        if( argc==2 && ( g_image = cvLoadImage( argv[1], 1 ) ) != 0 )
        {
        cvNamedWindow( "Contours", 1 );
        if( g_storage == NULL )
        {
        g_gray = cvCreateImage( cvGetSize(g_image), 8, 1 );
        g_storage = cvCreateMemStorage(0);
        }
        else
        {
        cvClearMemStorage( g_storage );
        }
        CvSeq* contours = 0;
        cvCvtColor( g_image, g_gray, CV_BGR2GRAY );
        //cvThreshold( g_gray, g_gray, g_thresh, 255, CV_THRESH_BINARY );
        cvFindContours( g_gray, g_storage, &contours );
        cvZero( g_gray );
        if( contours )
        {
        cvDrawContours(
        g_gray,
        contours,
        cvScalarAll(255),
        cvScalarAll(255),
        1);
        }
        cvShowImage( "Contours", g_gray );
        Presskey=cvWaitKey();
        printf("%c is pressed\n",Presskey);
        switch( Presskey )
        {
        case 's':
        cout<<"The image is going to be saved, please input the name:"<<endl;
        cin>>name[0];
        cvSaveImage( name[0], g_gray );
        break;
        default:
        break;
        }
        cvDestroyWindow( "Contours" );
        cvReleaseImage( &g_image );
        cvReleaseImage( &g_gray );
        }
        else
        return -1;
        return 0;
        }


    使用F15战机的二值图像进行了实验,下面是原图和结果图:

    =====================================



    展开全文
  • opencv学习笔记二十一:轮廓提取

    千次阅读 2018-09-09 15:19:45
    轮廓:一个轮廓代表一系列的点(像素),这一系列的点构成一个有序的点集,所以可以把一个轮廓理解为一个有序的点集。 在opencv中,提供了一个函数返回一个有序的点集或者有序的点集的集合(指多个有序的点集),...

    轮廓:一个轮廓代表一系列的点(像素),这一系列的点构成一个有序的点集,所以可以把一个轮廓理解为一个有序的点集。

    在opencv中,提供了一个函数返回一个有序的点集或者有序的点集的集合(指多个有序的点集),函数findContour是从二值图像中来计算轮廓的,一般使用Canny()函数处理后的图像,因为这样的图像含有边缘像素。

    寻找轮廓的API函数:

    findContours(image,vector<vector<Point>> contours,vector<Vec4i>hierarchy,int mode,int method,Point offset = Point(0,0));
    

    参数解释:

    (1)image:单通道图像矩阵,一般是经过canny处理后的二值图像;

    (2)contours:vector<vector<Point>>类型,是一个向量,并且是一个双重向量,向量内每个元素保存了一组由连续的Point点构成的点的集合的向量,每一组Point点集就是一个轮廓。有多少轮廓,向量contours就有多少元素;

    (3)hierarchy:vector<Vec4i> 类型, 即容器内每一个元素都是一个包含了4个int型变量的向量,向量内每个元素保存了一个包含4个int整型的数组。向量hiararchy内的元素和轮廓向量contours内的元素是一一对应的,向量的容量相同。hierarchy向量内每一个元素的4个int型变量——hierarchy[i][0] ~hierarchy[i][3],分别表示第i个轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果当前轮廓没有对应的后一个轮廓、前一个轮廓、父轮廓或内嵌轮廓的话,则hierarchy[i][0] ~hierarchy[i][3]的相应位被设置为默认值-1;

    (4)mode:int类型的,定义轮廓的检索模式:

    • CV_RETR_EXTERNAL只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略;
    • CV_RETR_LIST   检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓,所以hierarchy向量内所有元素的第3、第4个分量都会被置为-1,具体下文会讲到;
    • CV_RETR_CCOMP  检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层;
    • CV_RETR_TREE, 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。   

    (5)method:int类型,定义轮廓的近似方法:  

    • CV_CHAIN_APPROX_NONE 保存物体边界上所有连续的轮廓点到contours向量内;
    • CV_CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留;
    • CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法;                   

    (6) Point:偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在每一个检测出的轮廓点上加上该偏移量,一般不偏移取Point(0,0)。

    画轮廓的API函数:

    drawContours(Outputimage,contours,hierarchy,int contourIdx,color,int thickness ,int lineType,hierarchy = noArray(),int maxLevel = INT_MAX,Point offset = Point(0,0))
    

    参数解释:

        (1)outputimage: 将轮廓画在该图上;
        (2)contours:前面寻找到的轮廓;
        (3)contourIdx:是一个索引,代表绘制contours中的第几个轮廓;
        (4) color:颜色;
        (5)thickness: 线宽;
        (6)lineType: 线型;
        (7)hierarchy:可选层次信息结构,这里面是findContours所的到的基于Contours的层级信息;
        (8)maxLevel: 绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种。如果值为负数,函数不绘制同级轮廓,但会升序绘制直到级别为abs(max_level)-1的子轮廓;

        (9)offset:照给出的偏移量移动每一个轮廓点坐标.当轮廓是从某些感兴趣区域(ROI)中提取的然后需要在运算中考虑ROI偏移量时,将会用到这个参数。

    以上定义摘自该篇博客:https://blog.csdn.net/qq_39861376/article/details/82191999

    #include<opencv2/opencv.hpp>
    using namespace cv;
    using namespace std;
    
    int value = 50;
    Mat src, dst, canny_img;
    void callback(int, void*);
    int main(int arc, char** argv)
    {   
    	src = imread("2.jpg");
    	namedWindow("src",CV_WINDOW_AUTOSIZE);
    	imshow("src", src);
    	cvtColor(src, src, CV_BGR2GRAY);
    
    	namedWindow("output", CV_WINDOW_AUTOSIZE);
    	createTrackbar("threshold", "output", &value, 255, callback);
    	callback(0, 0);
    	waitKey(0);
    	return 0;
    }
    void callback(int, void*) {
    	Canny(src, canny_img, value, 2 * value);
    	imshow("canny", canny_img);
    	vector<vector<Point>>contours;
    	vector<Vec4i>hierarchy;
    	findContours(canny_img, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE,Point(0,0));
    
    	dst = Mat::zeros(src.size(), CV_8UC3);
    	RNG rng(1);
    	for (int i = 0; i < contours.size(); i++) {	
    		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
    		drawContours(dst, contours, i, color, 2, 8, hierarchy, 0, Point(0, 0));
    	}
    	imshow("output", dst);
    } 

    运行结果如下:

    展开全文
  • Opencv处理图像--轮廓提取

    千次阅读 2018-08-08 15:48:36
    Opencv处理图像--轮廓提取 使用cvfindContours 对图像进行轮廓检测。 #include&lt;iostream&gt; #include&lt;opencv2/core/core.hpp&gt; #include&lt;opencv2/highgui/highgui.hpp&gt; ...

    Opencv处理图像--轮廓提取

    使用cvfindContours 对图像进行轮廓检测。

    #include<iostream>
    #include<opencv2/core/core.hpp>
    #include<opencv2/highgui/highgui.hpp>
    int main()
    {
    	
    	IplImage* img = cvLoadImage("E:\\test.bmp",0); 
    	IplImage* imgColor = cvCreateImage(cvGetSize(img),8,3);
    	IplImage* contoursImage = cvCreateImage(cvSize(img->width,img->height),8,1);
    
    	cvNamedWindow("hui");
    	cvShowImage("hui",img);
    	cvThreshold(img,img,100,255,CV_THRESH_BINARY); //二值化图像以100为阀值
    	cvNamedWindow("2");
    	cvShowImage("2",img);
    	
    	CvSeq* contours = 0,* contoursTemp =0; 
    	cvZero(contoursImage);
    	
    	cvCvtColor(img,imgColor,CV_GRAY2BGR); //颜色转化函数
    
    	
    	//img :需要提前的图片需要二值
    	//storage:存放的空间
    	//contours:指向轮廓提取的第一个轮廓
    	//sizeof(CvContour):采用的是哪一种结构以及大小
    	//CV_RETR_LIST:轮廓存储方式
    	//CV_CHAIN_APPROX_NONE:采用坐标集表示轮廓
    	CvMemStorage* storage = cvCreateMemStorage(0);
    	int total = cvFindContours(img,storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_NONE,cvPoint(0,0)); 
    	printf("%d",total); //输出总的轮廓数
    	contoursTemp = contours;
    
    	while(contoursTemp!=0){
    		for(int i = 0;i<contoursTemp->total;i++){
    			CvPoint *pt = (CvPoint*)cvGetSeqElem(contoursTemp,i);
    			cvSetReal2D(contoursImage,pt->y,pt->x,255.0);
    			cvSet2D(imgColor,pt->y,pt->x,cvScalar(0,0,255.0));
    		}
    		contoursTemp = contoursTemp->h_next;  
    	}
    	cvNamedWindow("img");
    	cvShowImage("img",imgColor);
    	cvNamedWindow("contoursImage");
    	cvShowImage("contoursImage",contoursImage);
    	cvWaitKey(0);
    	return 0;
    }

    展开全文
  • OpenCV轮廓提取

    千次阅读 2018-05-21 00:14:32
    相应的轮廓提取分为以下两部分:1、cvThreshold(pImg, pImg, 150, 255, CV_THRESH_BINARY); cvShowImage("threshold", pImg); 对图像进行二值化,显示相应的图像2、cvFindContours(pImg, storage, &...

    相应的轮廓提取分为以下两部分:

    1、cvThreshold(pImg, pImg, 150, 255, CV_THRESH_BINARY);

         cvShowImage("threshold", pImg);

       对图像进行二值化,显示相应的图像

    2、cvFindContours(pImg, storage, &contour, sizeof(CvContour),

        mode, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));

        查找相应的轮廓

        cvDrawContours(pContourImg, contour,
    CV_RGB(0, 0, 255), CV_RGB(255, 0, 0),

    2, 2, 8, cvPoint(0, 0));

        画出相应的轮廓

    代码如下:

    IplImage* pImg = NULL;
    		IplImage* pContourImg = NULL;
    
    		CvMemStorage * storage = cvCreateMemStorage(0);
    		CvSeq * contour = 0;
    		int mode = CV_RETR_EXTERNAL;
    
    		if (argc == 3)
    		if (strcmp(argv[2], "all") == 0)
    		mode = CV_RETR_CCOMP; //内外轮廓都检测  
    
    
    		创建窗口  
    		cvNamedWindow("src", 1);
    		cvNamedWindow("contour", 1);
    		cvNamedWindow("threshold", 1);
    
    		argv[1] = "e:\\test.bmp";
    		载入图像,强制转化为Gray  
    		if ((pImg = cvLoadImage(argv[1], 0)) != 0)
    		{
    
    			cvShowImage("src", pImg);
    
    			//为轮廓显示图像申请空间  
    			//3通道图像,以便用彩色显示  
    			pContourImg = cvCreateImage(cvGetSize(pImg),
    				IPL_DEPTH_8U,
    				3);
    			//copy source image and convert it to BGR image  
    			cvCvtColor(pImg, pContourImg, CV_GRAY2BGR);
    		//	//----阈值分割-------------------------------------------  
    			cvThreshold(pImg, pImg, 150, 255, CV_THRESH_BINARY);
    			cvShowImage("threshold", pImg);
    		//	//-----------------------------------------------  
    		//	//查找contour----------------输入必须是二值图像  
    			cvFindContours(pImg, storage, &contour, sizeof(CvContour),
    				mode, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));
    
    		}
    		else
    		{
    			//销毁窗口  
    			cvDestroyWindow("src");
    			cvDestroyWindow("contour");
    			cvReleaseMemStorage(&storage);
    
    			return -1;
    		}
    		将轮廓画出      
    		cvDrawContours(pContourImg, contour,
    			CV_RGB(0, 0, 255), CV_RGB(255, 0, 0),
    			2, 2, 8, cvPoint(0, 0));
    		显示图像  
    		cvShowImage("contour", pContourImg);
    
    		cvWaitKey(0);
    		销毁窗口  
    		cvDestroyWindow("src");
    		cvDestroyWindow("contour");
    		释放图像  
    		cvReleaseImage(&pImg);
    		cvReleaseImage(&pContourImg);
    
    		cvReleaseMemStorage(&storage);
    
    		return 0;

    输入的图像为 argv[1] 参数1

    输出结果如下图所示:

    原图:


    二值图:


    轮廓图:


    展开全文
  • Opencv 轮廓提取

    千次阅读 2019-01-27 23:38:06
    边缘检测的一般步骤 滤波——消除噪声 增强——使边界轮廓更加明显 ...opencv2\opencv.hpp&gt; #include&lt;opencv2\highgui\highgui.hpp&gt; using namespace std; using namespace cv; //边...
  • opencv 轮廓提取

    千次阅读 2017-08-30 15:27:54
    轮廓指的是将连续的点连接在一起的曲线,具有相同的灰度值或颜色,提取轮廓就是提取这些具有相同颜色或灰度值的曲线 寻找轮廓应该用二值图,这样更明显 findcontours会改变原图,应该用copyto保存原图 查找轮廓应该...
  • 使用Opencv进行轮廓检测!所需函数:1. cvFindContours函数功能:从二值图像中检索轮廓,并返回检测到的轮廓的个数函数原型:int) cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour, ...
  • OpenCV学习指南(五)轮廓提取

    千次阅读 2020-04-11 13:23:44
    #图像中的轮廓提取 #时间:2019/1/3 #作者:cclplus #仅供学习交流使用 #如若照片本人认为侵犯了肖像权,请联系我的邮箱707101557@qq.com #如有疑问或者需求,可以联系作者的邮箱 #如果你有什么好的建议或者...
  • opencv中常用的跟轮廓相关的操作有:findContours()查找轮廓;drawContours()画轮廓轮廓填充;计算轮廓的面积和周长;提取轮廓凸包,矩形,最小外接矩形,外接圆等。它们都有相应的函数可以直接调用,那么任意形状...
  • 本范例主要介绍了如何提取轮廓和用一些形状描述符对轮廓进行表述,轮廓提取函数涉及到的参数很多,没有经常用到它的话,对参数的了解就不会太深刻,这里也按照本人搜索出来的一些资料进行总结,希望对大家有用。...
  • opencv轮廓内部的像素点怎么提取

    万次阅读 2016-05-04 19:13:54
    opencv轮廓内面积的提取
  • 轮廓提取后,它是用关键点组成的,下面提取出这些关键点。 1.先输出所有关键点的个数couttotal 2.for(int i=0;itotal;++i)  {  CvPoint* p = CV_GET_SEQ_ELEM(CvPoint,contour,i);  cout  }
  • opencv提取轮廓与抠图

    万次阅读 多人点赞 2014-10-30 10:41:59
    自然图像抠图/视频抠像技术梳理(image matting, video matting)-计算机视视觉专题1 图像抠图算法学习 - Shared Sampling for Real-Time Alpha Matting ... 学习opencv ,图像分割中分水岭算法的感性认识
  • 我想将二值图像里的边缘线(线段或一系列相互连接的线段)抽取出来,放到数组或什么数据结构里面,后面再继续进行处理。也是要根据二值图像里的点去拟合吗?有没有相关的文章推荐,中英文都可以!...
  • OpenCV手势识别-手掌特征提取

    万次阅读 2015-05-12 14:14:49
    本文对OpenCV轮廓凸包检测以及参考代码两个部分进行合并。并加入自己的图像预处理,包括采集、去背景和二值化。 实现了手掌的特征点提取。 图1 原始图像 步骤1 图像采集 红外摄像头采集回来的图像。基本上背景全部...
  • openCV学习之提取轮廓

    千次阅读 2016-01-20 19:59:32
    OpenCV中我们常用FindContour来提取轮廓,但常常根据需要会进行一些稍微复杂的操作,比如提取最外层轮廓等。 示例1: 示例2: 这里给几个网站供参考: 《openCV学习之轮廓》...
  • python-opencv获取二值图像轮廓及中心点坐标代码: groundtruth = cv2.imread(groundtruth_path)[:, :, 0] h1, w1 = groundtruth.shape contours, cnt = cv2.findContours(groundtruth.copy(), cv2.RETR_EXTERNAL,...
  • OPENCV提取连通区域轮廓

    万次阅读 2016-11-29 12:24:13
    通过轮廓提取图像分割后的连同区域
  • 这段时间一直在用opencv搞图像处理的问题,发现虽然可调用的函数多,但是直接找相应代码还是很困难,就行寻找连通域,并在连通域外侧加框,对于习惯使用Mat矩形操作的我,真心感觉代码少之又少,为防止以后自己还会...
  • OpenCV提取图像轮廓总结

    千次阅读 2014-06-06 14:42:33
    OpenCV提取图像轮廓总结
1 2 3 4 5 ... 20
收藏数 8,266
精华内容 3,306
关键字:

opencv轮廓提取