Próbowałem uniknąć zniekształcenia obrazu z kamery typu "rybie oko" (jeśli jest to istotne, używam GoPro) za pomocą zestawu do kalibracji kamery OpenCV. Mam większość procesu pracy i mogę generować niezakłócone obrazy. Jednak przy użyciu remapu obraz niezniekształcony jest "prawidłowym prostokątem" - innymi słowy, zwracany obraz jest przyciętą wersją oryginału, aby uniknąć zakrzywionych czarnych krawędzi, które są nieodłączne w niezakłóconych ramkach.Kalibracja pojedynczej kamery z OpenCV - Problemy z generowaniem "kompletnego" niezakłóconego obrazu
Podjęto próbę użycia metody getOptimalNewCameraMatrix() w celu naprawienia sytuacji, z bardzo dziwnymi rezultatami. Mam nadzieję, że jeden z was rzuci trochę światła na moje problemy.
Obecnie skalibrować aparat następująco:
double error = calibrateCamera(worldPoints, sensorPoints, process_size, cameraMatrix, distCoeffs, rvecs, tvecs, calibration_flags);
generujący cameraMatrix muszę. Ta część działa (myślę), ponieważ jeśli uruchomię to przez initUndistortRectifyMap(), a następnie przez remap(), otrzymam prawidłowy obraz z powrotem. Jednakże, szukam dla pełnego obrazu, więc następną rzeczą zrobić, to starać się poprawić mój cameraMatrix następująco:
int alpha = 1;
cameraMatrix_corr = getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, image.size(), alpha);
Potem generowania map X i Y przemapować, następująco (jest to zapożyczone bezpośrednio z książki kucharskiej OpenCV 2.0, więc jestem dość pewny, że to działa).
initUndistortRectifyMap(
cameraMatrix_corr, // computed camera matrix
distCoeffs, // computed distortion matrix
Mat(), // optional rectification (none)
Mat(), // camera matrix to generate undistorted
image.size(), // size of undistorted
CV_32FC1, // type of output map
map1, map2); // the x and y mapping functions
Wreszcie zmieniam moje zdjęcie!
// Apply mapping functions
remap(image, undistorted, map1, map2, INTER_LINEAR);
Oto moje wyniki dotychczas. Jeśli używam alpha = 0 (brak zmian w macierzy), otrzymam rozsądne (choć przycięte) wyniki.
Jeśli używam alfa = 1, co moim zdaniem powinno dać mi obraz z każdego oryginalnego piksela przydzielenie nowego obrazu, pojawia się następujący:
Więc, moje pytanie brzmi: co robię źle i dlaczego nie mogę po prostu uzyskać nieskalibrowanego, niezniekształconego obrazu z kalibracji?
Dziękuję wszystkim za zniesienie mnie, to jest moje pierwsze pytanie tutaj, ale starałem się być tak kompletny, jak to możliwe. Daj mi znać, jeśli jakoś spieprzyłem!
Miałem podobny problem, gdy obszar zainteresowania podany przez funkcję optymalizacji był zbyt mały. Opierając się na twoim "poprawieniu matrycy kamery, nie jest to coś, co powinieneś zrobić, aby nieodwzajemnić", próbowałem upuścić parametr 'newcameramtx' w' dst = cv2.undistort (img, camera_matrix, dist_coefs, None, newcameramtx) ', który rozwiązał wydanie dla mnie. Dzięki! –