gpt4 book ai didi

c++ - 如何在另一个函数中使用单应性的点/场景角作为 ROI 的输入

转载 作者:行者123 更新时间:2023-11-28 02:51:12 25 4
gpt4 key购买 nike

我想在识别后执行对象跟踪,目前无法识别对象并在对象周围画线。我现在想使用透视变换中计算的这四个点(场景角点)作为计算 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?对此的任何指导都会非常有帮助。

最佳答案

OpenCV 的 ROI 始终是直矩形。

您可以 check here how to create a bounding box对于你的 4 分 - 基本上你的 4 分在该教程中被称为“轮廓”。

相关代码:

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

关于c++ - 如何在另一个函数中使用单应性的点/场景角作为 ROI 的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23009017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com