gpt4 book ai didi

c++ - 如何提高轮廓精度?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:48:11 30 4
gpt4 key购买 nike

我正在使用 OpenCV 进行一个项目。我需要从高清照片中精确裁剪出一些对象。我正在使用四叉树将我的照片切割成碎片,然后我计算每个四边形的同质性以确定对象的一部分是否在四边形中。我根据四边形的同质性应用了一些具有不同阈值的过滤器作为 Canny。我希望这个描述是可以理解的。

此算法适用于某些类型的对象,但我对其他一些对象感到困惑。这里有一些我的问题的例子:我想要一种方法来压平我的轮廓。第一个截图是使用 canny 过滤器和 floodfill 之后的截图。第二个是最终的掩模结果。

http://pastebin.com/91Pgrd2D


为了达到这个结果,我使用了 cvFindContours() 所以我有了轮廓,但我找不到一种方法来处理它们。

最佳答案

也许您可以使用某种平均滤波器来近似曲线,然后使用具有小梯度的 AproxPoly 来平滑它。这是一个类似的方法:

void AverageFilter(CvSeq * contour, int buff_length)
{
int n = contour->total, i, j;
if (n > buff_length)
{
CvPoint2D32f* pnt;
float* sampleX = new float[buff_length];
float* sampleY = new float[buff_length];

pnt = (CvPoint2D32f*)cvGetSeqElem(contour, 0);
for (i = 0; i < buff_length; i++)
{
if (i >= buff_length / 2)
{
pnt = (CvPoint2D32f*)cvGetSeqElem(contour, i + 1 - buff_length / 2 );
}
sampleX[i] = pnt->x;
sampleY[i] = pnt->y;
}

float sumX = 0, sumY = 0;

for (i = 1; i < n; i++)
{
pnt = (CvPoint2D32f*)cvGetSeqElem(contour, i);
for (j = 0; j < buff_length; j++)
{
sumX += sampleX[j];
sumY += sampleY[j];
}
pnt->x = sumX / buff_length;
pnt->y = sumY / buff_length;
for (j = 0; j < buff_length - 1; j++)
{
sampleX[j] = sampleX[j+1];
sampleY[j] = sampleY[j+1];
}
if (i <= (n - buff_length / 2))
{
pnt = (CvPoint2D32f*)cvGetSeqElem(contour, i + buff_length / 2 + 1);
sampleX[buff_length - 1] = pnt->x;
sampleY[buff_length - 1] = pnt->y;
}
sumX = 0;
sumY = 0;
}
delete[] sampleX;
delete[] sampleY;
}
}

你给它轮廓和你想要做平均的点缓冲区的大小。如果您认为轮廓太粗是因为一些平均点捆绑在一起太近了,那么这就是 Aproxpoly 的用武之地,因为它减少了点数。但是要选择合适的渐变,这样就不会太尖锐了。

srcSeq = cvApproxPoly(srcSeq,sizeof(CvContour),storage, CV_POLY_APPROX_DP, x, 1);

尝试使用“x”,看看如何获​​得更好的结果。

关于c++ - 如何提高轮廓精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7644996/

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