【问题标题】:How to find corner coordinates of Image contour in Opencv and C如何在Opencv和C中找到图像轮廓的角坐标
【发布时间】:2012-06-04 23:40:16
【问题描述】:

我必须找到图像的角点,以便将其裁剪为矩形。我已经找到了轮廓并在其上使用了 approxpoly() 函数。现在如何找到轮廓的角坐标? 这是我的 C 代码->

#include <cv.h>
#include <highgui.h>

int main(int argc, char** argv)
{
IplImage *img,*gray;

if((img = cvLoadImage("save.jpg", 1)) == NULL)
{
    printf("A Img open error\n");
}

gray=cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1 );
cvCvtColor(img,gray,CV_BGR2GRAY);

IplImage* out_median = cvCreateImage(cvGetSize(gray),IPL_DEPTH_8U,1);
cvSmooth( gray,out_median,CV_MEDIAN,3);

IplImage* out_threshold = cvCreateImage( cvGetSize(out_median), out_median->depth, 1);
cvThreshold(out_median,out_threshold,1,255,CV_THRESH_BINARY);

CvMemStorage* storage = cvCreateMemStorage();
CvSeq* first_contour = NULL;

cvFindContours(out_threshold,storage,&first_contour,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);

CvSeq* approx_polygon = NULL;
approx_polygon=cvApproxPoly(first_contour,sizeof(CvContour),storage,CV_POLY_APPROX_DP,0.01*cvArcLength(first_contour,CV_WHOLE_SEQ, 1),0);

    //cvDrawContours(out_threshold,approx_polygon,cvScalarAll(255),cvScalarAll(255),100);
//cvShowImage("Contours", out_threshold );
//cvSaveImage("save_approxpoly_contour.jpg",out_threshold);


cvWaitKey(0);
return 0;

}

这是我应用 Approxpoly() 后的轮廓图像

【问题讨论】:

  • 如果你已经有了轮廓,一个简单的数学计算就会显示出角落的点。对您拥有的点进行简单的迭代,寻找左上角、右上角、左下角和右下角的点。无需为此使用其他库。这是基本的数学计算,如果我理解你的问题的话。
  • 是的,我知道你在说什么,比如寻找轮廓的右下角坐标,产品应该是最大的。你能告诉我什么函数会给我点以便可以迭代它们吗?有没有类似轮廓-> x/y之类的东西来获得点。
  • CvPoint pt = *(CvPoint*) cvGetSeqElement(contour, i); 上面消息中的这行代码就是我需要的全部。谢谢阿比德。
  • 那个雅虎群链接失效或半失效,群已关闭,会员需要批准,还有人可以访问吗?

标签: c image-processing opencv computer-vision


【解决方案1】:

我推荐使用cvBlob:

获取 blob:

cvThreshold(&src, &dst, 10, 255, CV_THRESH_BINARY);
IplImage *labelImg = cvCreateImage(cvGetSize(&dst),IPL_DEPTH_LABEL,1);
CvBlobs blobs;
unsigned int result = cvLabel(&dst, labelImg, blobs);

如果您有多个项目,请找出限制

int borders[4];
borders[0] = 99999; //left
borders[1] = 99999; //top
borders[2] = 0;  //right
borders[3] = 0;  //bottom

for (CvBlobs::const_iterator it=blobs.begin(); it!=blobs.end(); ++it)
{   
    if((*it).second->maxx) < borders[0]){
        borders[0] = (*it).second->maxx; 
    }
    if(((*it).second->miny) < borders[1]){
        borders[1] = (*it).second->miny;
    }
    if((*it).second->minx) > borders[2]){
        borders[2] = (*it).second->minx;
    }
    if(((*it).second->maxy) > borders[3]){
        borders[3] = (*it).second->maxy;
    }
}

【讨论】:

  • 只使用这段代码,我能得到图像的角点吗?
  • 取决于原始图像是什么,如果您将其阈值正确并且阈值图像的角落是您想要的角落,那么可以。如果上面的图像是阈值图像,那么您将通过查看blobs[0].second-&gt;maxx 和blobs[0].second-&gt;maxyy 得到角落(x,y)
猜你喜欢
  • 2012-01-06
  • 2023-03-09
  • 2017-02-07
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多