OpenCv 使用vector<Point>画出轮廓外接矩形

Hai

 1 IplImage* printrect(IplImage *contourim)
 2 {
 3
 4     IplImage *rectim=cvCreateImage(cvGetSize(contourim), IPL_DEPTH_8U, 3);
 5     int flag=1;
 6     vector<Point> points;
 7      for(;contourSeq!=NULL;contourSeq=contourSeq->h_next)
 8     {
 9
10
11         for(int i=0;i<contourSeq->total;i++)
12         {
13             CvPoint p;
14             CvPoint* p1=(CvPoint*)cvGetSeqElem(contourSeq,i);
15             p.x=p1->x;
16             p.y=p1->y;
17             points.push_back(p);
18
19         }
20         printf("No.%d contoured has pushed back\n",flag);
21         flag++;
22          CvRect rect = boundingRect(points);
23          CvPoint pt1,pt2;
24          pt1.x=rect.x;
25          pt1.y=rect.y;
26          pt2.x=rect.x+rect.width;
27          pt2.y=rect.y+rect.height;
28          cvRectangle(contourim,pt1,pt2,CV_RGB(0,0,255));
29          points.swap(vector<Point>());//每次使用完必须清空容器
30     }
31     rectim=contourim;
32     return rectim;
33
34
35 }

printrect

将一个轮廓的点全部置于轮廓中并画出其外接矩形后需要清空vector

points.swap(vector<Point>());

否则第二个轮廓点放入容器中会画出这两个轮廓所有点共同的外接矩形

直接运行代码

  1 #include "cv.h"
  2 #include "highgui.h"
  3 #include <stdio.h>
  4 #include <math.h>
  5 #include <iostream>
  6 #include <ctime>
  7 //#include<vector>
  8 using namespace cv;
  9 CvSeq *contourSeq = NULL,*contourSeq1=NULL,*contourSeq4rect=NULL;
 10
 11 IplImage* ImageThreshold(IplImage* src)
 12 {
 13     IplImage *gray,*binaryim;
 14     int height,width;
 15     gray=cvCreateImage(cvGetSize(src),src->depth,1);
 16     cvCvtColor(src,gray,CV_BGR2GRAY);
 17     height=gray->height;
 18     width=gray->width;
 19     printf("The canvas‘width is :%d,  height is :%d\n\n",width,height);
 20
 21     binaryim=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
 22     cvThreshold(gray,binaryim,128,255,CV_THRESH_BINARY_INV);
 23     return binaryim;
 24
 25 }
 26
 27 IplImage* printlunkuo(IplImage *binaryim)
 28 {
 29     CvMemStorage *contourStorage=cvCreateMemStorage();
 30     CvMemStorage *contourStorage4rect=cvCreateMemStorage();
 31     cvFindContours(binaryim, contourStorage, &contourSeq, sizeof(CvContour),CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));
 32
 33     IplImage *pOutlineImage = cvCreateImage(cvGetSize(binaryim), IPL_DEPTH_8U, 3);
 34     int nLevels = 5;
 35
 36     cvRectangle(pOutlineImage, cvPoint(0, 0), cvPoint(pOutlineImage->width, pOutlineImage->height), CV_RGB(0,0,0), CV_FILLED);
 37     cvDrawContours(pOutlineImage, contourSeq, CV_RGB(255,0,0), CV_RGB(0,255,0), nLevels,0.5);
 38
 39     int contourcount=0;
 40     for(;contourSeq!=NULL;contourSeq=contourSeq->h_next)
 41     {
 42         contourcount++;
 43     }
 44     printf("contour count is %d\n",contourcount);
 45
 46
 47     int pointcount=0;
 48     cvFindContours(binaryim, contourStorage, &contourSeq, sizeof(CvContour),CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));//重置contourSeq序列
 49
 50         for(;contourSeq!=NULL;contourSeq=contourSeq->h_next)
 51     {
 52         for(int i=0;i<contourSeq->total;i++)
 53     {
 54         CvPoint* p=(CvPoint*)cvGetSeqElem(contourSeq,i);
 55         cvCircle(pOutlineImage, *p, 1, CV_RGB(255, 255,255), 1);
 56         printf("p->x=%d,p->y=%d\n",p->x,p->y);
 57         pointcount++;
 58     }
 59         printf("point count =%d\n",pointcount);
 60         pointcount=0;
 61
 62        }
 63     cvFindContours(binaryim, contourStorage4rect, &contourSeq, sizeof(CvContour),CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));//重置contourSeq
 64
 65     return pOutlineImage;
 66
 67
 68
 69 }
 70
 71 IplImage* printrect(IplImage *contourim)
 72 {
 73
 74     IplImage *rectim=cvCreateImage(cvGetSize(contourim), IPL_DEPTH_8U, 3);
 75     int flag=1;
 76     vector<Point> points;
 77      for(;contourSeq!=NULL;contourSeq=contourSeq->h_next)
 78     {
 79
 80
 81         for(int i=0;i<contourSeq->total;i++)
 82         {
 83             CvPoint p;
 84             CvPoint* p1=(CvPoint*)cvGetSeqElem(contourSeq,i);
 85             p.x=p1->x;
 86             p.y=p1->y;
 87             points.push_back(p);
 88
 89         }
 90         printf("No.%d contoured has pushed back\n",flag);
 91         flag++;
 92          CvRect rect = boundingRect(points);
 93          CvPoint pt1,pt2;
 94          pt1.x=rect.x;
 95          pt1.y=rect.y;
 96          pt2.x=rect.x+rect.width;
 97          pt2.y=rect.y+rect.height;
 98          cvRectangle(contourim,pt1,pt2,CV_RGB(0,0,255));
 99          points.swap(vector<Point>());//每次使用完必须清空容器
100     }
101     rectim=contourim;
102     return rectim;
103
104
105 }
106
107
108
109 int main(int argc,char** argv)
110 {
111     IplImage *src,*binaryim,*contourim,*rectim;
112     src=cvLoadImage("gtest2.bmp",1);
113
114     binaryim=ImageThreshold(src);
115     cvNamedWindow("Binary_image",0);
116     cvShowImage("Binary_image",binaryim);
117
118     contourim = printlunkuo(binaryim);
119     cvNamedWindow("Contour_image",0);
120     cvShowImage("Contour_image",contourim);
121
122     rectim=printrect(contourim);
123     cvNamedWindow("Rect_image",0);
124     cvShowImage("Rect_image",rectim);
125
126
127
128     cvWaitKey(0);
129
130     cvDestroyWindow("Binary_image");
131     cvReleaseImage(&binaryim);
132     cvDestroyWindow("Contours_image");
133     cvReleaseImage(&contourim);
134     cvDestroyWindow("Rect_image");
135     cvReleaseImage(&rectim);
136
137     return 0;
138
139 }

The all

时间: 2024-07-29 06:56:20

OpenCv 使用vector<Point>画出轮廓外接矩形的相关文章

Opencv-python 找到图像轮廓并绘制,cv2.findContours()函数,求轮廓外接矩形,cv2.boundingrect()

一.查找图像轮廓 opencv-python中查找图像轮廓的API为:findContours函数 该函数接受二值图作为参数,根据参数,可查找物体外轮廓.内外轮廓,保存轮廓点.压缩等等... 如:contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) def findContours(image, mode, method, contours=None, hierarchy=None

26、【opencv入门】轮廓查找与绘制(4)——正外接矩形

一.简介 1.使用特定形状的轮廓包围 在实际应用中, 经常会有将检测到的轮廓用多边形表示出来的需求, 提取包围轮廓的多边形也方便我们做进一步分析, 轮廓包围主要有一下几种: 轮廓外接矩形.轮廓最小外接矩形(旋转).轮廓最小包围圆形.轮廓拟合椭圆.轮廓逼近多边形曲线 2.轮廓外接矩形 --- boundingRect() 1 CV_EXPORTS_W Rect boundingRect(InputArray points); points: 输入的二维点集, 可以填Mat类型或std::vecto

机器学习进阶-项目实战-信用卡数字识别 1.cv2.findContour(找出轮廓) 2.cv2.boudingRect(轮廓外接矩阵位置) 3.cv2.threshold(图片二值化操作) 4.cv2.MORPH_TOPHAT(礼帽运算突出线条) 5.cv2.MORPH_CLOSE(闭运算图片内部膨胀) 6. cv2.resize(改变图像大小) 7.cv2.putText(在图片上放上文本)

7. cv2.putText(img, text, loc, text_font, font_scale, color, linestick) # 参数说明:img表示输入图片,text表示需要填写的文本str格式,loc表示文本在图中的位置,font_size可以使用cv2.FONT_HERSHEY_SIMPLEX, font_scale表示文本的规格,color表示文本颜色,linestick表示线条大小 信用卡数字识别: 信用卡      数字模板涉及到的内容:主要是采用模板匹配的思想 思

OpenCV入门笔记(六) 轮廓检测(Detect Contours)

轮廓(Contours),指的是有相同颜色或者密度,连接所有连续点的一条曲线.检测轮廓的工作对形状分析和物体检测与识别都非常有用. 在轮廓检测之前,首先要对图片进行二值化或者Canny边缘检测.在OpenCV中,寻找的物体是白色的,而背景必须是黑色的,因此图片预处理时必须保证这一点. cv2.findContours函数 Python版示例如下,也可以参考[OpenCV-Python教程(11.轮廓检测)][Contours : Getting Started] contours, hierar

opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形

一.简介 二.外接矩形的查找绘制 1 #include "opencv2/opencv.hpp" 2 using namespace cv; 3 void main() 4 { 5 //外接矩形的查找绘制 6 Mat srcImg =imread("E://12.jpg"); 7 imshow("src",srcImg); 8 Mat dstImg = srcImg.clone(); //原图备份 9 cvtColor(srcImg, srcIm

opencv学习之路(26)、轮廓查找与绘制(五)——最小外接矩形

一.简介 二.轮廓最小外接矩形的绘制 1 #include "opencv2/opencv.hpp" 2 using namespace cv; 3 4 void main() 5 { 6 //轮廓最小外接矩形的绘制 7 Mat srcImg = imread("E://00.png"); 8 Mat dstImg = srcImg.clone(); 9 cvtColor(srcImg, srcImg, CV_BGR2GRAY); 10 threshold(srcI

OpenCV入门教程之八 直线、轮廓的提取与描述

基于内容的图像分析的重点是提取出图像中具有代表性的特征,而线条.轮廓.块往往是最能体现特征的几个元素,这篇文章就针对于这几个重要的图像特征,研究它们在OpenCV中的用法,以及做一些简单的基础应用. 一.Canny检测轮廓 在上一篇文章中有提到sobel边缘检测,并重写了soble的C++代码让其与matlab中算法效果一致,而soble边缘检测是基于单一阈值的,我们不能兼顾到低阈值的丰富边缘和高阈值时的边缘缺失这两个问题.而canny算子则很好的弥补了这一不足,从目前看来,canny边缘检测在

Opencv 最小外接矩形合并拼接

前一篇画出了最小外接矩形,但是有时候画出来的矩形由于中间像素干扰或者是其他原因矩形框并不是真正想要的 如图1是一个信号的雨图,被矩形框分割成了多个小框: 需要合并矩形框达到的效果: 主要思想: 扫描两次最小外接矩形,第一次扫描出的矩形是图一的小矩形,遍历vector指定一个合并最大距离(假设是80),达到指定距离使用画矩形函数将这两个矩形占据的组合区域染成实心矩形. 第二次扫描直接扫描之前画的实心矩形图确定最终边框 过程图 膨胀处理和像素翻转: 代码: #include "core/core.h

OpenCV与EmguCV中的图像轮廓提取

轮廓是图像中表示边界的一系列点的集合. 虽然边缘检测算法可以根据像素间的差异检查出轮廓边界的像素,但是它并没有把轮廓做为一个整体表示出来.所以下一步工作是把这些边缘检测出来的像素组装成轮廓. openCV中可以用findContours()函数来从二值图像中提取轮廓. openCV中一般用序列来存储轮廓信息.序列中的每一个元素是曲线中一个点的位置. 函数findContours()从二值图像中寻找轮廓.findContours()处理的图像可以是Canny()后得到的有边缘像素的的图像,也可以是