如何使用失真系数解开jpeg图像文件?

时间:2012-06-19 08:42:48

标签: java opencv javacv

我的网络摄像头有一个扭曲的快照。作为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));

但我不知道如何初始化各个cvMat的内在矩阵和失真系数。?

1 个答案:

答案 0 :(得分:2)

为什么不使用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 Pointers:)

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

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

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

然后,您将使用以下方法逐个设置值: opencv_core.cvSet2D(matrix, i, j, value); 其中i为行,j为列!

还有其他问题吗?

Cheerio!