【发布时间】: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