6

我的网络摄像头有一张失真的快照。作为 jpeg 文件,固有矩阵和失真系数:-

matrix intrisic matrix
      (1137.0919189453125,0.0,383.99273681640625)
      (0.0,264.17974853515625,312.74951171875)
      (0.0,0.0,1.0)

matrix distortion :-
    (-0.26913660764694214)
    (0.22259517014026642)
    (-0.0928017795085907)
    (0.26249778270721436)

我不知道如何在 CvMat 中加载这些失真系数,以便使用这些失真系数获得未失真的图像。另外,我只想使用 javacv 来做到这一点。

编辑:-另外,我知道功能

IplImage mapx=cvCreateImage(cvSize(src_img),IPL_DEPTH_32F,1);
IplImage mapy=cvCreateImage(cvSize(src_img),IPL_DEPTH_32F,1);

cvInitUndistortMap(CvMat intrinsic,CvMat distortion, IplImage mapx, IplImage mapy); 
cvRemap(IplImage tm,IplImage src,IplImage mapx,IplImage mapy,CV_INTER_LINEAR|CV_WARP_FILL_OUTLIERS,cvScalarAll(0));

但我不知道如何为固有矩阵和失真系数初始化各自的 cvMats。?

4

1 回答 1

3

为什么不使用cv::undistort

它将您的矩阵作为其参数。

void undistort(const Mat& src, Mat& dst, const Mat& cameraMatrix, const Mat& distCoeffs, const Mat& newCameraMatrix=Mat())

src矩阵就是你的形象。

dst矩阵是未失真的图像。

是你的cameraMatrix内在矩阵。

distCoeffs矩阵是您的失真矩阵。

从文档中引用:

将在校正后的图像中可见的源图像的特定子集可以通过 来调节newCameraMatrix。您可以使用 GetOptimalNewCameraMatrix 来计算适当的newCameraMatrix,具体取决于您的要求。


好的。我刚刚找到了您评论的答案....我想。

public static native void cvUndistortPoints(CvMat src, CvMat dst, CvMat camera_matrix, CvMat dist_coeffs, CvMat R/*=null*/, CvMat P/*=null*/); 您可以在http://www.java2s.com/Open-Source/Android/UnTagged/educationalrobots/name/audet/samuel/javacv/jna/cv.java.htm中找到它。

这实际上在imgproc中。

只需制作最后两个参数null


第二部分 - 初始化 CvMat - 比看起来更难,因为如果你想优雅地做,你必须弄乱指针,我忘记了如何使用 JNA 指针 :)

所以这是一个替代解决方案:使用这个构造函数public static CvMat create(int rows, int cols, int type);

因此,对于您的矩阵,您将拥有三行和三列。

您的类型可能是 cxcore.java 中的类型之一,可能CV_64FC1是单通道double类型。否则,如果您使用floats,它将是CV_32FC1.

然后,您将使用以下方法一一设置值: 行在opencv_core.cvSet2D(matrix, i, j, value); 哪里,列在哪里!ij

还有问题吗?

干杯!

于 2012-06-19T10:02:54.080 回答