Как использовать точки / углы сцены гомографии в качестве входных данных для ROI в другой функции

Я хочу выполнить отслеживание объекта после распознавания, в настоящее время я не в состоянии распознать объект и нарисовать линии вокруг объекта. Теперь я хотел бы использовать эти четыре точки (углы сцены), вычисленные в перспективном преобразовании, в качестве входных данных для вычисления ROI и использовать его для отслеживания в последующих кадрах.

Моя текущая реализация

JNIEXPORT jint JNICALL Java_org_opencv_samples_tutorial2_ObjReco_MatchFeatures(JNIEnv*, jobject, jlong addrGray12, jlong addrRgba12,jlong kalmanaddrRgb)
{
Mat& mGr12  = *(Mat*)addrGray12;
Mat& mRgb12 = *(Mat*)addrRgba12;
Mat H = findHomography( obj, scene, CV_RANSAC); // to find homography
perspectiveTransform( obj_corners, scene_corners, H);// obtain scene corners using perspective transform
setrectagnlepoint(scene_corners); // method to set the points
}

JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_LKTrack_LKTracker(JNIEnv*, jobject, jlong LKtrackgray1,jlong LKtracknew2,jlong LKTrackRgba1)
{

vector<Point2f> features;
vector<Point2f> RectRoi;
Mat RoiLK;
Rect rect;
Mat LKprev;
Mat& LKRgba1 = *(Mat*)LKTrackRgba1;
Mat& LKgray2 = *(Mat*)LKtrackgray1;
Mat regiongray;

LKcounter++;
if (LKcounter == 1) // set rect using points from previous method for the first time
{
RectRoi=getrectagnlepoint(); // get points from previous method to set ROI
rect = Rect(RectRoi[0].x,RectRoi[0].y,(RectRoi[1].x-RectRoi[0].x),(RectRoi[3].y-RectRoi[0].y));
//rect = Rect(100,100,40,40);
}

LKgray2.copyTo(LKprev);
RoiLK= LKprev(rect);

cv::goodFeaturesToTrack(RoiLK,features,6000,0.6,2,Mat(),2);

// Update features to your ROI location
for (i=0; i<features.size();i++)
{
features[i].x= features[i].x+RectRoi[0].x;
features[i].y= features[i].y+RectRoi[0].y;
}// code to calculate optical flow

// code to predict new bounding box

}

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

OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows) in cv::Mat::Mat(const cv::Mat&, const Rect&), file /home/reports/ci/slave_desktop/50-SDK/opencv/modules/core/src/matrix.cpp, line 323

Вопрос в том, как убедиться, что точки с точки зрения перспективы образуют идеальный прямоугольник, а также есть ли метод для создания ROI для наклонного прямоугольника? Любое руководство по этому вопросу будет очень полезным.

0

Решение

ROI OpenCV всегда является прямым прямоугольником.

Вы можете проверьте здесь, как создать ограничивающий прямоугольник за ваши 4 балла — в основном ваши 4 балла в этом уроке называются «контуром».

Соответствующий код:

approxPolyDP( Mat(contour), contour_poly, 3, true );
boundRect = boundingRect( Mat(contour_poly) );
1

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

похоже, что преобразование отображает точки объекта на точки, которые находятся за пределами области сцены. Вы должны были бы проверить и проверить преобразованные точки.

1