twórz matrycę kamery opencv dla iPhone 5 solvepnp
Rozwijam aplikację dla iPhone ' a przy użyciu opencv. Muszę użyć metody solvePnPRansac:
Http://opencv.willowgarage.com/documentation/cpp/camera_calibration_and_3d_reconstruction.html{[4]
Do tej metody muszę dostarczyć matrycę aparatu:
__ __
/ fx 0 cx /
| 0 fy cy /
|_0 0 1 _|
Gdzie cx i cy reprezentują środkowe pozycje pikseli obrazu, a fx i fy reprezentują ogniskowe, ale to wszystko, co mówi dokumentacja. Nie jestem pewien, co podać dla tych ogniskowych. IPhone 5 ma ogniskową 4,1 mm, ale nie sądzę, aby ta wartość była użyteczna tak, jak jest.
Sprawdziłem inną stronę:
Http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html
Który pokazuje jak opencv tworzy matryce kamer. Tutaj stwierdza, że ogniskowe są mierzone w jednostkach pikseli.
Sprawdziłem inny strona internetowa:
Http://www.velocityreviews.com/forums/t500283-focal-length-in-pixels.html
(mniej więcej w połowie drogi w dół) mówi, że ogniskową można przekształcić z jednostek milimetrów na piksele, używając równania: fx = fy = focalMM * pixelDensity/25.4;
Kolejny Link, który znalazłem stwierdza, że fx = focalMM * width / (sensorSizeMM); fy = focalMM * length / (sensorSizeMM);
Nie jestem pewien co do tych równań i jak prawidłowo to stworzyć matrix.
Każda pomoc, porady lub linki, Jak stworzyć dokładną matrycę aparatu (szczególnie dla iPhone 5) będą bardzo mile widziane,
Izaak
P. S. myślę, że (fx/fy) lub (fy/fx) mogą być równe proporcjom kamery, ale to może być całkowicie błędne.
UPDATE:
Współrzędne pikseli do linii 3D (opencv)
Korzystając z tego linku, mogę dowiedzieć się, jak chcą formatować fx i fy, ponieważ używają go do skalowania kąty w stosunku do ich odległości od centrum. dlatego fx i fy są prawdopodobnie w pikselach / (długość jednostki), ale nadal nie jestem pewien, jaka powinna być ta długość jednostki, czy może być dowolna, o ile X i y są skalowane do siebie?
5 answers
Można uzyskać wstępne (przybliżone) oszacowanie ogniskowej w pikselu dzieląc ogniskową w mm przez szerokość piksela matrycy aparatu (CCD, CMOS, cokolwiek).
Otrzymujesz pierwszy z instrukcji aparatu lub odczytujesz go z nagłówka EXIF obrazu wykonanego w pełnej rozdzielczości. Znalezienie tego ostatniego jest nieco bardziej skomplikowane: możesz zajrzeć do arkusza specyfikacji czujnika, jeśli znasz jego producenta i numer modelu, lub możesz po prostu podzielić ogólny szerokość jego wrażliwego obszaru przez liczbę pikseli z boku.
W przypadku braku innych informacji, zwykle można założyć, że piksele są kwadratowe (tzn. fx == fy), a matryca jest ortogonalna do osi ogniskowej obiektywu (tzn. że termin w pierwszym rzędzie i drugiej kolumnie matrycy aparatu wynosi zero). Ponadto współrzędne pikseli głównego punktu (cx, cy) są zwykle trudne do dokładnego oszacowania bez starannie zaprojektowanego urządzenia kalibracyjnego i starannie wykonanego procedura kalibracji (to dlatego, że są one wewnętrznie mylone z tłumaczeniem kamery równolegle do płaszczyzny obrazu). Najlepiej więc ustawić je na równi z geometrycznym środkiem obrazu, chyba że wiesz, że obraz został przycięty asymetrycznie.
Dlatego najprostszy model aparatu ma tylko jeden nieznany parametr, ogniskową f = fx = fy.
Mała rada: w aplikacji jest zwykle wygodniejsze do przenoszenia w poziomie (lub pionowy) kąt widzenia, a nie długość ogniskowej w pikselach. Dzieje się tak dlatego, że FOV jest niezmienny dla skalowania obrazu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-10 00:23:26
"ogniskowa", z którą masz do czynienia, to po prostu współczynnik skalowania z obiektów na świecie do pikseli aparatu, używany w modelu kamery otworkowej (Link Do Wikipedii) . Dlatego jego jednostki to piksele / długość jednostki. Dla danego f, obiekt o rozmiarze L w odległości (prostopadłej do kamery) z, będzie f*L/z.
Można więc oszacować ogniskową, umieszczając obiekt o znanej wielkości w znanej odległości od aparatu i mierząc jego rozmiar na obrazie. Można ASO założyć, że centralnym punktem jest środek obrazu. Zdecydowanie nie należy ignorować zniekształcenia obiektywu (dist_coef parametr w solvePnPRansac ).
W praktyce najlepszym sposobem uzyskania matrycy i współczynników zniekształceń jest użycie narzędzia do kalibracji aparatu. Możesz pobrać i używać oprogramowania mrpt camera_calib z ten link, Istnieje również samouczek wideo tutaj . Jeśli używasz matlab, przejdź do Camera Calibration Toolbox .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-08 10:05:46
Tutaj masz tabelę ze specyfikacją Aparatów Dla iPhone 4 i 5. Obliczenie wynosi:
double f = 4.1;
double resX = (double)(sourceImage.cols);
double resY = (double)(sourceImage.rows);
double sensorSizeX = 4.89;
double sensorSizeY = 3.67;
double fx = f * resX / sensorSizeX;
double fy = f * resY / sensorSizeY;
double cx = resX/2.;
double cy = resY/2.;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-05 23:18:22
Spróbuj tego:
func getCamMatrix()->(Float, Float, Float, Float)
{
let format:AVCaptureDeviceFormat? = deviceInput?.device.activeFormat
let fDesc:CMFormatDescriptionRef = format!.formatDescription
let dim:CGSize = CMVideoFormatDescriptionGetPresentationDimensions(fDesc, true, true)
// dim = dimensioni immagine finale
let cx:Float = Float(dim.width) / 2.0;
let cy:Float = Float(dim.height) / 2.0;
let HFOV : Float = format!.videoFieldOfView
let VFOV : Float = ((HFOV)/cx)*cy
let fx:Float = abs(Float(dim.width) / (2 * tan(HFOV / 180 * Float(M_PI) / 2)));
let fy:Float = abs(Float(dim.height) / (2 * tan(VFOV / 180 * Float(M_PI) / 2)));
return (fx, fy, cx, cy)
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-20 10:49:30
Stary wątek, obecny problem.
[[2]}Jak Milo i Isaac wspomniali po odpowiedzi Milo, wydaje się, że nie ma "wspólnych" paramów dostępnych dla, powiedzmy, iPhone 5.Dla tego, co jest warte, oto wynik uruchomienia z narzędziem kalibracji MRPT, z dobrym starym iPhone 5:
[CAMERA_PARAMS]
resolution=[3264 2448]
cx=1668.87585
cy=1226.19712
fx=3288.47697
fy=3078.59787
dist=[-7.416752e-02 1.562157e+00 1.236471e-03 1.237955e-03 -5.378571e+00]
Average err. of reprojection: 1.06726 pixels (OpenCV error=1.06726)
Zauważ, że dist
oznacza tutaj zniekształcenie.
Przeprowadzam eksperymenty nad projektem zabawki, z tymi parametrami - - - w sumie ok. Jeśli używasz ich we własnym projekcie, pamiętaj o tym że mogą nie być wystarczająco dobre, aby zacząć. Najlepiej będzie zastosować się do zaleceń Milo z własnymi danymi. Narzędzie MRPT jest dość łatwe w użyciu, z szachownicą, którą zapewniają. Mam nadzieję, że to pomoże zacząć !
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-30 02:02:20