Java 如何使用失真系数取消jpeg图像文件的失真?
我的网络摄像头的快照失真了。作为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)
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);/:-)