【问题标题】:List of CvPoint2D32f to cvMat to calculate Homography using JavaCV使用 JavaCV 计算 Homography 的 CvPoint2D32f 到 cvMat 列表
【发布时间】:2012-02-21 17:33:20
【问题描述】:

使用 JavaCV。 我在 ArrayList 中有两组 CvPoint2D32f 点,一组来自手机的图像采集器,另一组来自已知的恒定图像源。

我想应用 cvFindHomogrpahy() 方法使用这些点来找到点之间的 Homography Matrix。我正在使用以下代码尝试执行此操作,但我被困在如何从我知道的点到 cvFindHomogrpahy() 方法作为参数的 2 cvMat 上:

matsrc = cvCreateMat(points.size(), 2, CV_32FC1);
matdst = cvCreateMat(known.size(), 2, CV_32FC1);

for(int s=0; s < points.size(); s++){
     CvPoint2D32f p = (CvPoint2D32f)points.get(i).get("Point");
     //Add this point to matsrc                         
}

for(int s=0; s < known.size(); s++){
     CvPoint2D32f p = (CvPoint2D32f)known.get(i).get("Point");
     //Add this point to matdst                         
}


CvMat mat = cvCreateMat(3, 3, CV_32FC1);
cvFindHomography(matsrc, matdst, mat); //Here the matrices created are used to find the 3x3 Homography transform Matrix

我这样做是完全错误的吗?

【问题讨论】:

    标签: java opencv javacv


    【解决方案1】:

    总之你可以使用 CvMat 的 put 方法。

    以下是对代码进行一些修改后的完整解决方案:

    import java.io.*;
    import java.util.*;
    
    import static com.googlecode.javacv.cpp.opencv_core.*;
    import static com.googlecode.javacv.cpp.opencv_imgproc.*;
    import static com.googlecode.javacv.cpp.opencv_highgui.*;
    import static com.googlecode.javacv.cpp.opencv_calib3d.*;
    
    /**
     *
     * @author rics
     */
    public class Main {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {      
        List<CvPoint2D32f> points = new ArrayList<CvPoint2D32f>();
        List<CvPoint2D32f> known = new ArrayList<CvPoint2D32f>();
        // points and known should be filled with valid values
        // here are just some ad-hoc numbers that do not result a singular (unsolvable) configuration 
        for(int i=0; i < 2; i++){
            points.add(cvPoint2D32f((double)i,10 - 2* (double)i));
            known.add(cvPoint2D32f((double)i,10 - 2*(double)i));
        }
        for(int i=2; i < 5; i++){
            points.add(cvPoint2D32f((double)i,(double)i));
            known.add(cvPoint2D32f((double)i,(double)i));
        }
        CvMat matsrc = cvCreateMat(points.size(), 2, CV_32FC1);
        CvMat matdst = cvCreateMat(known.size(), 2, CV_32FC1);
    
        // filling the matrices with the point coordinates
        for(int s=0; s < points.size(); s++){
            CvPoint2D32f p = points.get(s);//.get("Point");
            //Add this point to matsrc                         
            matsrc.put(s,0,p.x());
            matsrc.put(s,1,p.y());
        }
    
        for(int s=0; s < known.size(); s++){
            CvPoint2D32f p = known.get(s);//.get("Point");
            //Add this point to matdst                         
            matdst.put(s,0,p.x());
            matdst.put(s,1,p.y());
        }
    
        CvMat mat = cvCreateMat(3, 3, CV_32FC1);
        cvFindHomography(matsrc, matdst, mat); //Here the matrices created are used to find the 3x3 Homography transform Matrix
        // displaying the resulting matrix
        for( int i = 0; i < 3; ++i) {
            for( int j = 0; j < 3; ++j) {
            System.out.print(mat.get(i,j) + ",");
            }
            System.out.println();
        }
        }
    }
    

    我的结果是:

    1.0,5.011022034363615E-16,-5.249974158069671E-15,
    1.6479031282788333E-15,1.0,-5.495862740459911E-15,
    4.4222287862990617E-16,1.2693993089577568E-16,1.0,
    

    【讨论】:

      猜你喜欢
      • 2012-05-25
      • 2012-09-23
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 2012-07-22
      • 2021-10-07
      • 2016-09-19
      相关资源
      最近更新 更多