C 找到三个最大的轮廓(现在实现两个)

C 找到三个最大的轮廓(现在实现两个),c,linux,opencv,area,contour,C,Linux,Opencv,Area,Contour,朋友们,我正在使用opencv进行编码。我想在图片/视频中找到三个最大的轮廓,我写的代码可以找到两个最大的轮廓,我很难找到第三个最大的轮廓,所以我需要你的建议,圣诞快乐! 这是我的核心代码,如何更改 CvSeq *cont = 0 cvFindContours( tempImg, storage, &cont, sizeof(CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) ); CvSeq *contma

朋友们,我正在使用opencv进行编码。我想在图片/视频中找到三个最大的轮廓,我写的代码可以找到两个最大的轮廓,我很难找到第三个最大的轮廓,所以我需要你的建议,圣诞快乐! 这是我的核心代码,如何更改

CvSeq *cont = 0
cvFindContours( tempImg, storage, &cont, sizeof(CvContour), 
CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) ); 

CvSeq *contmax = 0;
CvSeq *contmax2 = contmax;

for(;cont;cont = cont->h_next) //get the two max area, and mark
{
    area = fabs(cvContourArea( cont, CV_WHOLE_SEQ )); 
    printf("area == %lf\n", area);
    if(area > maxArea)
    {
        contmax2 = contmax;
        max2Area = maxArea;
        contmax = cont;
        maxArea = area;
    }
    else if(area > max2Area && area < maxArea)
    {
        contmax2 = cont;
        max2Area = area;
    }

}
CvRect aRect = cvBoundingRect( contmax, 0 );
CvRect bRect = cvBoundingRect( contmax2, 0 ); 
CvSeq*cont=0
cvFindContours(温度、存储和控制、尺寸(CvContour),
CV_-RETR_树,CV_-CHAIN_-APPROX_-SIMPLE,cvPoint(0,0));
CvSeq*contmax=0;
CvSeq*contmax2=contmax;
对于(;cont;cont=cont->h_next)//获取两个最大面积,并标记
{
面积=晶圆厂(面积(续,全尺寸);
printf(“面积==%lf\n”,面积);
如果(面积>最大面积)
{
contmax2=contmax;
max2Area=maxArea;
contmax=cont;
最大面积=面积;
}
否则如果(面积>最大面积和面积<最大面积)
{
contmax2=cont;
max2Area=面积;
}
}
CvRect aRect=cvBoundingRect(contmax,0);
CvRect-bRect=cvBoundingRect(contmax2,0);
这个怎么样

#define N 3

double maxArea[N] = {0};
CvSeq *countours[N], *tmp_cont;
double tmp_area;

for(;cont;cont = cont->h_next)
{
    area = fabs(cvContourArea(cont, CV_WHOLE_SEQ));
    printf("area == %lf\n", area);

    for(int i = N-1; i >= 0; --i)
    {
        if(area > maxArea[i])
        {
            maxArea[i] = area;
            countours[i] = cont;
            for(int j = (i-1); j >= 0; --j)
            {
                if(maxArea[j] < maxArea[j+1])
                {
                    tmp_area = maxArea[j+1];
                    tmp_cont = contours[j+1];
                    maxArea[j+1] = maxArea[j];
                    contours[j+1] = contours[j];
                    maxArea[j] = tmp_area;
                    contours[j] = tmp_cont;
                }
            }
            break;
        }
    }

}
#定义N 3
双maxArea[N]={0};
CvSeq*计数[N],*tmp_cont;
双tmp_区;
对于(;cont;cont=cont->h_next)
{
面积=晶圆厂(面积(续,全尺寸);
printf(“面积==%lf\n”,面积);
对于(int i=N-1;i>=0;--i)
{
如果(面积>最大面积[i])
{
最大面积[i]=面积;
计数[i]=续;
对于(int j=(i-1);j>=0;--j)
{
if(maxArea[j]
您能给我们一些输入和输出示例,以及自己编译和执行程序的方法吗?哦,这是一段很长的代码,我正在为robot vision编写程序。我在Linux中使用gcc编译它。你可以使用tempImg作为输入。如果我们能够编译一些东西以便调试它,这将非常有帮助。你当前的方法有什么问题?为什么你不能用3个轮廓代替2个?嗨,浮士德,所有轮廓的数量大约是20个,现在我需要找到三个最大的轮廓。根据您的代码,等高线[0]、等高线[1]和等高线[2]是三个最大的等高线,对吗?好策略!我现在就去试试,谢谢!是的,它可以工作!但是我printf maxArea[0]maxArea[1]maxArea[2],maxArea[0]是一个很大的数字,maxArea[1]和[2]是0,怎么了?双倍?,噢,解决了。我没有将area和maxArea声明为相同的变量,都是int或double。ThxOMG,最大面积是正确的,但第二个和第三个可能是错误的,有时都是正确的。发生了什么事