Java 如何使用失真系数取消jpeg图像文件的失真?

Java 如何使用失真系数取消jpeg图像文件的失真?,java,opencv,javacv,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)

我的网络摄像头的快照失真了。作为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。

为什么不使用? 它以矩阵为参数

void undistort(常量Mat&src、Mat&dst、常量Mat&cameraMatrix、常量Mat&distcoefs、常量Mat&newCameraMatrix=Mat())

src
矩阵是您的图像

dst
矩阵是未失真的图像

cameraMatrix
是您的内在矩阵

distcoefs
矩阵是失真矩阵

引用文件:

源图像的特定子集,将在中可见 校正后的图像可由
newCameraMatrix
调节。你可以用 GetOptimalNewCameraMatrix以计算适当的
newCameraMatrix
, 根据您的要求


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

public static native void cvUndistortPoints(CvMat src、CvMat dst、CvMat camera_矩阵、,
CvMat dist_coefs,CvMat R/*=null*/,CvMat P/*=null*/)
你可以在这本书中找到

这实际上在imgproc

只需将最后两个参数
null


第二部分——初始化CvMat——比看起来更难,因为如果你想优雅地完成它,就必须处理指针,而我忘记了如何使用JNA指针:)

因此,这里有一个替代解决方案: 使用这个构造函数
publicstaticcvmatcreate(int行、int列、int类型)

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

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

然后,您可以使用以下方法逐个设置值:
opencv_core.cvSet2D(矩阵,i,j,值)
其中,
i
是行,
j
是列

还有问题吗


干杯

@LokeshKumar我想我找到了方法。我编辑了这个问题以将其包括在内。@LokeshKumar的“但我不知道如何初始化各个cvMat的固有矩阵和失真系数”,你的意思是说你不知道如何初始化
cvMat
数据结构,还是说你不知道如何获得实际值?是的。。我不知道如何使用上述固有系数和失真系数值初始化cvMat数据结构@LokeshKumar在搜索了大量源代码后终于完成了我的编辑!我认为可以在CvMat对象中加载值。。只需使用cvmatObj.put(i,j,value);/:-)