EmguCV - Fisheye Calibration - PullRequest
       13

EmguCV - Fisheye Calibration

0 голосов
/ 05 июня 2018

В школьном проекте я пытаюсь откалибровать IP-камеру Dahua с искажением типа «рыбий глаз».Нам нужно откалибровать камеру, чтобы не искажать изображение, потому что нам нужно плоское изображение для обработки изображения.

До сих пор нам удалось выполнить калибровку в Python с OpenCV, но остальная часть сценариянаписано на C #, поэтому мы хотели бы преобразовать код в C # с помощью оболочки EmguCV (OpenCV для .NET)

Исправьте меня, если я ошибаюсь, но до сих пор я выполнил следующие шаги:

  • Я сделал 50 снимков шахматной доски, которая используется для поиска углов
  • Я позволил OpenCV вычислить правильные матрицы, одна из которых называется CameraMatrix, а другая - коэффициент искажений.
  • С помощью 2 рассчитанных матриц мы затем уничтожаем изображение, и в результате получаем плоское изображение без искажений.

В Python этот код работает.Я получаю 2 матрицы, которые работают, чтобы неискажать.Я пытался скопировать эти матрицы в C #, не делая остальную часть калибровки.Поскольку настройка камеры одинакова, искажение должно быть одинаковым.Однако, когда я пытаюсь жестко закодировать матрицы, результат не тот, который я хочу.

Может ли это быть проблемой, связанной с EmguCV (оболочкой OpenCV для .NET), или это связано с моим кодом??

Код Python

img = cv2.imread(filename)
K = np.array(...) # removed for brevity
D = np.array(...) # removed for brevity
DIM = (width, height) # image resolution
map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, D, np.eye(3), K, DIM, cv2.CV_16SC2)
undistorted_img = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)

C # код

Matrix<double> cameraMatrix = new Matrix<double>(3, 3);
Matrix<double> distortionCoeffs = new Matrix<double>(4, 1);
Mat outputMap1 = new Mat();
Mat outputMap2 = new Mat();
Mat r = new Mat(); // Can be empty, according to the documentation
Mat p = new Mat(); // Can be empty, according to the documentation
Fisheye.InitUndistorRectifyMap(cameraMatrix, distortionCoeffs, r, p, image.Size, DepthType.Cv32F, outputMap1, outputMap2);
CvInvoke.Remap(image, undistorted, outputMap1, outputMap2, Inter.Linear, BorderType.Constant);
...