как неискажать файл изображения jpeg, используя коэффициенты искажения?

У меня искаженный снимок моей веб-камеры. как файл 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));

но я не знаю, как инициализировать соответствующие cvMats для внутренней матрицы и коэффициента искажения.?


person Lokesh Kumar    schedule 19.06.2012    source источник


Ответы (1)


Почему бы не использовать 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 :)

Итак, вот альтернативное решение: используйте этот конструктор 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 — столбец!

Есть еще вопросы?

Привет!

person eboix    schedule 19.06.2012
comment
@LokeshKumar Думаю, я нашел метод. Я отредактировал вопрос, чтобы включить его. - person eboix; 19.06.2012
comment
@LokeshKumar Но я не знаю, как инициализировать соответствующие cvMats для внутренней матрицы и коэффициента искажения, вы имеете в виду, что не знаете, как инициализировать структуру данных cvMat, или что вы не знаете, как получить фактическую ценности? - person eboix; 19.06.2012
comment
да .. я не знаю, как инициализировать структуру данных cvMat, используя указанные выше значения внутренних коэффициентов и коэффициентов искажения !! - person Lokesh Kumar; 19.06.2012
comment
@LokeshKumar Наконец-то закончил редактирование после поиска тонны исходного кода! - person eboix; 19.06.2012
comment
я думаю, что можно загружать значения в объект CvMat.. просто с помощью cvmatObj.put(i,j,value); //:-) - person Lokesh Kumar; 25.06.2012