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的内在矩阵和失真系数.
cv::undistort?它以你的矩阵作为参数。
void undistort(const Mat& src, Mat& dst, const Mat& cameraMatrix, const Mat& distCoeffs, const Mat& newCameraMatrix=Mat())
矩阵src就是你的图像。
矩阵dst是未失真的图像。
这cameraMatrix是你的内在矩阵。
该distCoeffs矩阵是你的畸变矩阵。
引用文档:
可以通过 来调节在校正图像中可见的源图像的特定子集
newCameraMatrix。newCameraMatrix您可以根据您的要求使用 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是列!
还有其他问题吗?
干杯!