【问题标题】:object detection with contours in region of interest在感兴趣区域中使用轮廓进行对象检测
【发布时间】:2017-06-09 15:41:32
【问题描述】:

我想使用轮廓进行对象检测。我可以将对象与背景分离。我在图像中心有一个边界框。我想当对象在边界框中时检测它。我使用`

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

用于显示 i 和 j 中的所有轮廓。并使用此代码

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

用于检测感兴趣区域中的对象。但是当我运行程序时,我的代码已中断
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)) } 
}
    } 
        }`

我有两个边界框,当对象位于比另一个边界框更小的边界框时,我想要隐藏。

【问题讨论】:

  • 不应该是contours[i][j] == contours[x][y]吗?
  • 我对此进行了测试,但结果没有任何变化
  • 你能发布错误吗?
  • 没有错误。我的程序构建成功但是当我运行它时,代码执行停止。
  • 小心 C++ 的comma operatorcontours[i, j] 几乎肯定不会像你认为的那样做。

标签: c++ opencv opencv-contour


【解决方案1】:

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

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 的实际边界等发现了这一点。我不知道您使用的是什么构建环境和选项,但是当您尝试访问容器边界外时,它们中的很多都支持提出有用的调试断言和有意义的异常。您应该使用这些类型的系统来帮助您。您还应该打开更多编译器警告,因为您的代码到处都是错误,其中任何一个都可能导致您出现问题,并且使诊断这个问题变得更加困难。

【讨论】:

  • 好答案。你是对的。非常感谢。但是如果我使用 Harriscorners 进行对象检测,我可以检测感兴趣区域中的对象吗?
  • 在不了解您正在使用的图像和您尝试检测的对象的情况下,我不能说。在很多情况下角检测器可以提供帮助。
  • 我试图检测的对象与背景有差异。例如,我的对象与背景相比更亮或更暗,并且对象的大小不是很大
  • 针对一些背景,比如有很多噪音或者其他你不关心的东西,你会发现角落检测器会有很多响应,其中大部分是你不想要的.您需要将其与其他一些表征对象的方式结合起来(这同样取决于该对象的性质)。
猜你喜欢
  • 2016-08-12
  • 2014-05-20
  • 2011-08-10
  • 2012-03-11
  • 1970-01-01
  • 2012-04-25
  • 2012-02-22
  • 2015-06-07
相关资源
最近更新 更多