& Quot; Иногда & Quot; получение значения мусора для целочисленного типа varibale в openCV

Я строю программу, используя основную идею обнаружения квадратов из 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;
}

0

Решение

В вашей функции findMin_x_pointA есть проблема. Вы должны сравнить с < оператор для возврата минимального значения.

Другая проблема, поскольку вы получаете min_x = 149186927 и min_y = 149186937, чтобы решить эту проблему, проверьте значения в pt_reader сразу после копирования точек из квадратов CvSeq.

0

Другие решения

Еще ссылка / похожий вопрос: c ++ алгоритм запуска команды после обнаружения квадрата

Хорошо, у меня тоже была эта проблема. Не могу вспомнить, как я это решил, но если ваша проблема заключается в следующем, то мое решение, вероятно, правильное.

Вы сказали:

Но иногда я получаю min_x = 149186927 и min_y = 149186937

Иногда, когда есть более одного квадрата? Если один квадрат, вы получите нормальные значения, верно? Если это так, я подозреваю, что вам нужно очистить / очистить pt_reader после обнаружения после каждого квадрата. Надеюсь, что это работает.

Удачи. Если нет, вы всегда можете обратиться к аналогичному вопросу для получения дополнительных идей по редактированию кода, пока он не будет работать нормально. Если это работает, дайте мне знать (:

0

По вопросам рекламы [email protected]