Я хочу выполнить отслеживание объекта после распознавания, в настоящее время я не в состоянии распознать объект и нарисовать линии вокруг объекта. Теперь я хотел бы использовать эти четыре точки (углы сцены), вычисленные в перспективном преобразовании, в качестве входных данных для вычисления 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 для наклонного прямоугольника? Любое руководство по этому вопросу будет очень полезным.
ROI OpenCV всегда является прямым прямоугольником.
Вы можете проверьте здесь, как создать ограничивающий прямоугольник за ваши 4 балла — в основном ваши 4 балла в этом уроке называются «контуром».
Соответствующий код:
approxPolyDP( Mat(contour), contour_poly, 3, true );
boundRect = boundingRect( Mat(contour_poly) );
похоже, что преобразование отображает точки объекта на точки, которые находятся за пределами области сцены. Вы должны были бы проверить и проверить преобразованные точки.