【问题标题】:Homography for set of trainimages训练图像集的单应性
【发布时间】: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


    【解决方案1】:

    我以前做过这个,我没有看到比将大部分内容放在 for 循环中更好的解决方案。您应该只在循环之外获取任何不变的内容,并尝试重用数据,而不是为每个循环重新创建所有内容。

    【讨论】:

      猜你喜欢
      • 2018-09-17
      • 2015-09-09
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 2017-03-16
      • 2017-12-12
      • 2014-01-22
      • 2020-10-05
      相关资源
      最近更新 更多