Я строю программу, используя основную идею обнаружения квадратов из square.c
образцов openCV. Я обнаруживаю квадраты в CvSeq*
а затем я вычисляю минимальные_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;
Затем я пытаюсь получить Minimum_x и Minimum_y из этих 4 координат квадрата, чтобы я мог создать 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 есть проблема. Вы должны сравнить с < оператор для возврата минимального значения.
Другая проблема, поскольку вы получаете min_x = 149186927 и min_y = 149186937, чтобы решить эту проблему, проверьте значения в pt_reader сразу после копирования точек из квадратов CvSeq.
Еще ссылка / похожий вопрос: c ++ алгоритм запуска команды после обнаружения квадрата
Хорошо, у меня тоже была эта проблема. Не могу вспомнить, как я это решил, но если ваша проблема заключается в следующем, то мое решение, вероятно, правильное.
Вы сказали:
Но иногда я получаю min_x = 149186927 и min_y = 149186937
Иногда, когда есть более одного квадрата? Если один квадрат, вы получите нормальные значения, верно? Если это так, я подозреваю, что вам нужно очистить / очистить pt_reader
после обнаружения после каждого квадрата. Надеюсь, что это работает.
Удачи. Если нет, вы всегда можете обратиться к аналогичному вопросу для получения дополнительных идей по редактированию кода, пока он не будет работать нормально. Если это работает, дайте мне знать (: