使用感兴趣区域中的轮廓进行目标检测

object detection with contours in region of interest

我想为对象使用轮廓 detection.I 可以将对象与背景分开。我在 image.I 的中心有一个边界框想要当对象在边界框中时,检测 it.I 使用`

for(int i = 0; i < contours.size(); i++) {
    for (int j = 0; j < contours[i].size();j++)  {  
        cout << contours[i][j] << endl;
        // ...

显示 i & j.and 中的所有轮廓使用此代码

for(int x = 405; x < 455; x++) {
    for (int y = 210; y < 280; y++) {
        if (contours[i, j] == contours[x, y])
        // ...

当我 运行 程序时,为了检测 interest.but 区域中的对象,我的代码已经中断
if (contours[i, j] == contours[x, y]) .你有办法解决我的问题吗?谢谢你的帮助。

`//draw each contour with a random color
int idx = 0;
for (; idx >= 0; idx = hierarchy[idx][0]){ Scalar color(rand() & 255, rand() & 255);
    if (contourArea(contours[idx]) < 20)
        drawContours(dst2, contours, idx, color, CV_FILLED);}
for (int i = 0; i < contours.size(); i++){
    for (int j = 0; j < contours[i].size();j++){
        //  cout << contours[i][j] << endl;
        for (int x = 405; x < 455; x++) {
            for (int y = 210; y < 280; y++){
                if (contours[i][j] == contours[x][y]) {
                    rectangle(frame, rectangle2, Scalar(255, 255, 255)) } 
}
    } 
        }`

我有两个边界框,我希望当对象处于比另一个边界框隐藏更小的边界框中时。

这可能是有问题的代码块。

for (int x = 405; x < 455; x++) {
    for (int y = 210; y < 280; y++) {
        if (contours[i][j] == contours[x][y]) {
            rectangle(frame, rectangle2, Scalar(255, 255, 255)) } 
    }
} 

这里有问题的一点是 contours[x][y],因为它假定您有(至少)455 个等高线,并且从第 405 个开始的 50 个等高线有(至少)280 个点。这几乎肯定不是你想要做的,并且鉴于你的程序崩溃,这绝对意味着你没有找到足够的轮廓,或者足够长的轮廓来使它有意义。

contours 不是具有 x 和 y 坐标的图像,而是零个或多个边界的列表,其中每个边界都有一定数量的点(大概至少 3 个,但我不知道当然)。 countours[i][j] 没问题,因为您已经检查过 ij 在封闭的 for 循环中是否在边界内。

我无法建议您应该怎么做,因为您的代码有很多印刷错误(并非所有错误都已修复)并且您的问题不清楚。我怀疑您需要从 contours[i][j] 处找到的点开始,看看它是否在您的投资回报率范围内。您不需要遍历 xy 值来执行此操作。

真的,你应该已经通过使用调试器、检查 contours 的实际边界等发现了这一点。我不知道您使用的是什么构建环境和选项,但是当您尝试访问超出容器边界时,其中很多都支持引发有用的调试断言和有意义的异常。您应该使用这些类型的系统来帮助您。您还应该打开更多编译器警告,因为您的代码 乱七八糟 有错误,其中任何一个都可能导致您出现问题,并使诊断此问题变得比需要的更加困难。