2012-10-16 10 views
6

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.

Image (alpha = 1)

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:

Image(alpha = 0)

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!

Odpowiedz

4

Uważam, że korekta matrycy aparatu nie jest czymś, co powinieneś zrobić, aby nie rozkołysać, ponieważ dałoby to matrycę aparatu tak, jakby nie było zniekształceń.

Jeśli nie chcesz "tracić" informacji o obrazie, najlepiej jest przesunąć mapę w osi X i Y i zamapować obraz na większy obraz. Dzieje się tak, ponieważ gdy niezniekształcanie pikseli w rogach przesunie się na zewnątrz, aby poprawić obraz.

Należy pamiętać, że obiektywy typu rybie oko mają duże zniekształcenia i mogą nawet nie zostać w pełni usunięte nawet przy użyciu poprawnego kodu.

+1

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! –

Powiązane problemy