zoukankan      html  css  js  c++  java
  • 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
    ",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
    
    ",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
    ",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
    ",p->x,p->y); 
     57         pointcount++;
     58     } 
     59         printf("point count =%d
    ",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
    ",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
  • 相关阅读:
    matlab中输入x. 与x的区别
    nginx 访问控制之deny allow
    nginx 反向代理之 负载均衡
    http 缓存机制简介
    nginx 反向代理之 proxy_cache
    nginx 反向代理之 proxy_buffering
    nginx 反向代理之 proxy_redirect
    nginx 反向代理之 proxy_set_header
    nginx 反向代理之 proxy_pass
    nginx 反向代理配置示例
  • 原文地址:https://www.cnblogs.com/gaohai/p/5744059.html
Copyright © 2011-2022 走看看