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

Lok*_*mar 5 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)
Run Code Online (Sandbox Code Playgroud)

我不知道如何在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));
Run Code Online (Sandbox Code Playgroud)

但我不知道如何初始化相应的cvMats的内在矩阵和失真系数.

ebo*_*oix 3

为什么不使用cv::undistort

它以你的矩阵作为参数。

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

矩阵src就是你的图像。

矩阵dst是未失真的图像。

cameraMatrix是你的内在矩阵。

distCoeffs矩阵是你的畸变矩阵。

引用文档:

可以通过 来调节在校正图像中可见的源图像的特定子集newCameraMatrixnewCameraMatrix您可以根据您的要求使用 GetOptimalNewCameraMatrix 来计算适当的。


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

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); 其中i是行,j是列!

还有其他问题吗?

干杯!