我的网络摄像头有一个扭曲的快照。作为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的内在矩阵和失真系数。?
答案 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!