gpt4 book ai didi

c++ - opencv轮廓区域返回零

转载 作者:行者123 更新时间:2023-11-28 00:34:39 25 4
gpt4 key购买 nike

我正在学习 opencv,通过使用同名的书。我想计算等高线的面积,但它总是返回 0。等高线被绘制为封闭的多边形,所以这似乎是正确的。

那里有一些样本,但它们使用的是 vector<vector<Point>> contours .我下面的代码基于书籍示例。我使用的引用图像是 grayscale一个。

所以我的问题是:我缺少什么来获得面积 != 0?

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

#define CVX_RED CV_RGB(0xff,0x00,0x00)
#define CVX_BLUE CV_RGB(0x00,0x00,0xff)

int main(int argc, char* argv[]) {

cvNamedWindow( argv[0], 1 );

IplImage* img_8uc1 = cvLoadImage( argv[1], CV_LOAD_IMAGE_GRAYSCALE );
IplImage* img_edge = cvCreateImage( cvGetSize(img_8uc1), 8, 1 );
IplImage* img_8uc3 = cvCreateImage( cvGetSize(img_8uc1), 8, 3 );

cvThreshold( img_8uc1, img_edge, 128, 255, CV_THRESH_BINARY );
CvMemStorage* storage = cvCreateMemStorage();

CvSeq* contours = NULL;
int num_contours = cvFindContours(img_edge, storage, &contours, sizeof(CvContour),
CV_RETR_LIST, CV_CHAIN_APPROX_NONE, cvPoint(0, 0));
printf("Total Contours Detected: %d\n", num_contours );

int n=0;
for(CvSeq* current_contour = contours; current_contour != NULL; current_contour=current_contour->h_next ) {

printf("Contour #%d\n", n);
int point_cnt = current_contour->total;
printf(" %d elements\n", point_cnt );

if(point_cnt < 20){
continue;
}

double area = fabs(cvContourArea(current_contour, CV_WHOLE_SEQ, 0));
printf(" area: %d\n", area );

cvCvtColor(img_8uc1, img_8uc3, CV_GRAY2BGR);
cvDrawContours(img_8uc3, current_contour, CVX_RED, CVX_BLUE, 0, 2, 8);

cvShowImage(argv[0], img_8uc3);

cvWaitKey(0);
n++;
}

printf("Finished contours.\n");

cvCvtColor( img_8uc1, img_8uc3, CV_GRAY2BGR );

cvShowImage( argv[0], img_8uc3 );
cvWaitKey(0);
cvDestroyWindow( argv[0] );
cvReleaseImage( &img_8uc1 );
cvReleaseImage( &img_8uc3 );
cvReleaseImage( &img_edge );

return 0;
}

最佳答案

发生这种情况不是因为“区域”为 0,而是因为您使用带有标志 %d(整数)而不是 %f( double )的 printf。如果您使用适当的标志,您将看到“区域”的实际值(value)。出于这个原因,我总是使用 cout 而不是 printf。这样就省去了很多此类问题。

旁注。您在这里学习的是 OpenCV 的 C 接口(interface)。我建议您改为学习它的 C++ 接口(interface)(它从 2.0 版开始添加到 OpenCV 中)。首先,C 接口(interface)已被弃用,很可能会从下一版本的 OpenCV 中完全删除。其次,它比C++接口(interface)更复杂。在 cvFindContours 的情况下,它要复杂得多。 Here您可以找到所有接口(interface)所需的文档。

关于c++ - opencv轮廓区域返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21443436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com