【问题标题】:"Sometimes" getting garbage value for an integer type varibale in openCV“有时”在openCV中获取整数类型变量的垃圾值
【发布时间】:2014-02-19 15:31:28
【问题描述】:

我使用从square.c 的 openCV 样本中检测正方形的基本思想构建了一个程序。我检测CvSeq* 中的正方形,然后计算 minimum_x、min_y、宽度和列,为每个检测到的正方形创建单独的图像。

问题: 但有时我会收到min_x = 149186927min_y = 149186937

我正在for loop 中执行以下过程,即for(int i=0; i<square.size(); i+=4)。所以,如果我检测到 12 个正方形,那么它适用于所有 12 个正方形。但是我的程序在一段时间后崩溃了。无论是一个正方形还是多个正方形,它都可以使用一段时间。

首先,我将正方形的四个点存储如下:

    CvPoint pt_reader[4] ;
    pt_reader[0].x =  ( (CvPoint*)cvGetSeqElem(squares, i) )->x; // first coordinate 
    pt_reader[0].y =  ( (CvPoint*)cvGetSeqElem(squares, i) )->y;

    pt_reader[1].x =  ( (CvPoint*)cvGetSeqElem(squares, i+1) )->x;// second coordinate
    pt_reader[1].y =  ( (CvPoint*)cvGetSeqElem(squares, i+1) )->y;

    pt_reader[2].x =  ( (CvPoint*)cvGetSeqElem(squares, i+2) )->x;
    pt_reader[2].y =  ( (CvPoint*)cvGetSeqElem(squares, i+2) )->y;

    pt_reader[3].x =  ( (CvPoint*)cvGetSeqElem(squares, i+3) )->x;
    pt_reader[3].y =  ( (CvPoint*)cvGetSeqElem(squares, i+3) )->y;

然后我尝试从正方形的这 4 个坐标中获取 minimum_x 和 minimum_y,以便创建 ROI

        int min_x = findMin_x_pointA(pt_reader); 
        int min_y = findMin_y_pointB(pt_reader); 
        int max_x = findMax_x_pointC(pt_reader);
        int max_y = findMax_y_pointD(pt_reader);

计算 ROI 的行数和列数

        int cols = max_x - min_x;
        int rows = max_y - min_y;

现在,我终于要为 ROI 创建一个图像了

        if(rows>0 && rows<300 && cols>0 && cols<300)
        {
            Mat mySquare;
            mySquare.create(rows, cols, CV_8UC3);
            cout<<"\nROI:  "<<min_x<<"   "<<min_y<<"   "<<cols<<"   "<<rows;
            Rect regionOfInterest = Rect (min_x,min_y, cols, rows);
            mySquare= original_frame(regionOfInterest);

            squareImages.push_back(mySquare);

        }

我计算最小值的函数如下所示:

int FindRect::findMin_x_pointA(CvPoint pt_reader[] )
{
    CvPoint pointA;
        int min_x =pt_reader[0].x;

        for(int i=1; i<4; i++)
        {
            if(min_x > pt_reader[i].x)
            {
                min_x= pt_reader[i].x;
            }
        }
        return min_x;
    }

【问题讨论】:

  • findMin_x_pointA 等的定义在哪里.....
  • 我已经更新了帖子。请看一下
  • 怎么样?我写了if(min_x &gt; pt_reader[i].x) 然后min_x= pt_reader[i].x; 所以我存储了最小值
  • 由于某些原因,人们似乎无法使用“>”来查找最小值,但据我所知,该代码有效。在出现垃圾的情况下,您可能无法检测到正方形。您是否使用过调试器来确保获得正确的结果?
  • @DavidNilosek:对不起,我没有调试器……但我想知道为什么它会进入if loop?我已经签到if loop

标签: c++ opencv image-processing computer-vision roi


【解决方案1】:

您的 findMin_x_pointA 函数有问题。您应该与

另一个问题,当你得到 min_x = 149186927 和 min_y = 149186937 时,为了解决这个问题,在你从正方形 CvSeq 复制点后立即检查 pt_reader 中的值。

【讨论】:

  • min_x > pt_reader[i].x 与 pt_reader[i].x
  • 我已经检查了if (rows &lt;300 &amp;&amp; cols&lt;300),那么为什么它会进入if loop内部
【解决方案2】:

更多参考/类似问题:c++ algorithm for running a command after detecting square

好的,我以前也有这个问题。不太记得我是怎么解决的了,但是如果你的问题如下,那么我的解决方案可能是对的。

你说:

但有时我得到 min_x = 149186927 和 min_y = 149186937

有时当有多个正方形时?如果是一个正方形,您确实会返回正常值,对吗?如果是这样,我怀疑您需要在每个方块后检测到您的pt_reader 后清除/清空您的pt_reader。希望有效。

祝你好运。如果没有,您可以随时参考类似的问题以获得更多想法来编辑您的代码,直到它正常工作。如果可行,请告诉我(:

【讨论】:

  • 实际上整个部分都在for loop 中,即for(int i=0; i&lt;square.size(); i+=4)。所以,如果我检测到 4 个正方形,那么它适用于所有 4 个正方形。但是我的程序在一段时间后崩溃了。无论是一个正方形还是多个正方形,它都可以使用一段时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
  • 2022-11-18
相关资源
最近更新 更多