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?

Author: Community, 2013-02-04

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.

 10
Author: Francesco Callari,
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 .

 6
Author: Milo,
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.;
 4
Author: user2743760,
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)
}
 1
Author: Gigi,
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ąć !

 1
Author: Eric Platon,
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