【发布时间】:2014-02-19 15:31:28
【问题描述】:
我使用从square.c 的 openCV 样本中检测正方形的基本思想构建了一个程序。我检测CvSeq* 中的正方形,然后计算 minimum_x、min_y、宽度和列,为每个检测到的正方形创建单独的图像。
问题: 但有时我会收到min_x = 149186927 和min_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 > pt_reader[i].x)然后min_x= pt_reader[i].x;所以我存储了最小值 -
由于某些原因,人们似乎无法使用“>”来查找最小值,但据我所知,该代码有效。在出现垃圾的情况下,您可能无法检测到正方形。您是否使用过调试器来确保获得正确的结果?
-
@DavidNilosek:对不起,我没有调试器……但我想知道为什么它会进入
if loop?我已经签到if loop
标签: c++ opencv image-processing computer-vision roi