【发布时间】:2013-12-22 18:10:09
【问题描述】:
如果您有从图像训练集中获得的关键点,我如何使用 findhomography() 和 perspectiveTransform() 方法。
以下是我的代码。
cv::BruteForceMatcher<cv::HammingLUT > descriptormatcher;
descriptormatcher.add(addtraindesc);
descriptormatcher.train();
descriptormatcher.match(descriptor1,matches1);
//calculate min and max distance between keypoints
double max_dist = 0;
double min_dist = 100;
for (int i_desc=0; i_desc< descriptor1.rows;i_desc++)
{
double dist=matches1[i_desc].distance;
if( dist < min_dist ) min_dist = dist;
if( dist > max_dist ) max_dist = dist;
}
//Get only good matches
vector<DMatch> goodmatches;
for (int i_desc=0; i_desc< descriptor1.rows;i_desc++)
{
double good_dist=3*min_dist ;
if( matches1[i_desc].distance < good_dist )
{ goodmatches.push_back( matches1[i_desc]); }
}
// calculate object and scene points
std::vector<Point2f> obj;
std::vector<Point2f> scene;
vector<vector<KeyPoint> > newtrainkeypoints=gettrainkeypoints();
for(int i_gm=0; i_gm<goodmatches.size(); i_gm++)
{
DMatch imatch = goodmatches[i_gm];
obj.push_back(newtrainkeypoints[imatch.imgIdx][imatch.trainIdx].pt);
scene.push_back(v1[imatch.queryIdx].pt);
}
Mat H = findHomography( obj, scene, CV_RANSAC );
std::vector<Point2f> obj_corners(4);
// how to calculate the obj_corners for array of images from training set
std::vector<Point2f> scene_corners(4);
perspectiveTransform( obj_corners, scene_corners, H);
line( mRgb1, scene_corners[0], scene_corners[1], Scalar(0, 255, 0), 4 );
line( mRgb1, scene_corners[1], scene_corners[2], Scalar( 0, 255, 0), 4 );
line( mRgb1, scene_corners[2], scene_corners[3], Scalar( 0, 255, 0), 4 );
line( mRgb1, scene_corners[3], scene_corners[0], Scalar( 0, 255, 0), 4 );
一个快速的肮脏解决方案是将整个代码部分放在一个 forloop 中,用于训练集中的所有图像,如果好的匹配数大于 4 则执行单应性。但这在性能方面非常无效因为我打算将此代码用于我正在开发的 android 项目的 JNI 部分。
谁能指导我如何进行透视变换并在检测到的对象周围绘制一个矩形或建议任何更好的方法。(到目前为止,在我通过互联网搜索时,我只能找到 1 比 1 的图像匹配和然后为检测到的对象绘制单应性)
【问题讨论】:
标签: android opencv image-processing computer-vision homography