OpenCV 3.0 «рыбий глаз» калибровка

Я пытаюсь откалибровать свою камеру «рыбий глаз», используя opencv 3.0.

Я использую этот код:

int _imageWidth = 5184;
int _imageHeight = 3456;
cv::Matx33d _cameraMatrix;
cv::Vec4d _distCoeffs;
std::vector<std::vector<cv::Point2d> > imagePoints(1);
std::vector<std::vector<cv::Point3d> > objectPoints(1);
std::vector<cv::Vec3d> rvecs(1);
std::vector<cv::Vec3d> tvecs(1);
int flags = cv::fisheye::CALIB_RECOMPUTE_EXTRINSIC | cv::fisheye::CALIB_FIX_SKEW | cv::fisheye::CALIB_FIX_K3 | cv::fisheye::CALIB_FIX_K4 ;double rms = cv::fisheye::calibrate(objectPoints, imagePoints, cv::Size(_imageWidth, _imageHeight), _cameraMatrix, _distCoeffs, rvecs, tvecs, flags, cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 100, DBL_EPSILON));

Я использую это фото:

картина успеха

с этим objectPoints:

{x=-2.4998999999999998 y=0.00000000000000000 z=0.00000000000000000 }
{x=-1.7677000000000000 y=-1.7677000000000000 z=0.00000000000000000 }
{x=-1.7677000000000000 y=1.7678000000000000 z=0.00000000000000000 }
{x=-1.9699000000000000 y=0.00000000000000000 z=1.5391999999999999 }
{x=-1.3929000000000000 y=-1.3929000000000000 z=1.5391999999999999 }
{x=-1.3929000000000000 y=1.3930000000000000 z=1.5391999999999999 }
{x=0.00000000000000000 y=-2.4998999999999998 z=0.00000000000000000 }
{x=0.00000000000000000 y=-1.9699000000000000 z=1.5391999999999999 }
{x=0.00000000000000000 y=0.00000000000000000 z=2.5000000000000000 }
{x=0.00000000000000000 y=1.9700000000000000 z=1.5391999999999999 }
{x=0.00000000000000000 y=2.5000000000000000 z=0.00000000000000000 }
{x=1.3930000000000000 y=-1.3929000000000000 z=1.5391999999999999 }
{x=1.3930000000000000 y=1.3930000000000000 z=1.5391999999999999 }
{x=1.9700000000000000 y=0.00000000000000000 z=1.5391999999999999 }
{x=1.7678000000000000 y=-1.7677000000000000 z=0.00000000000000000 }
{x=1.7678000000000000 y=1.7678000000000000 z=0.00000000000000000 }
{x=2.5000000000000000 y=0.00000000000000000 z=0.00000000000000000 }

и это imagePoints:

{x=2464.5648148148148 y=443.00925925925924 }
{x=3429.7624113475172 y=756.99645390070907 }
{x=1540.6558441558441 y=901.56493506493507 }
{x=2487.5740740740739 y=967.90740740740739 }
{x=3095.3457711442784 y=1160.3308457711441 }
{x=1911.0628415300546 y=1260.0136612021856 }
{x=3904.2130801687763 y=1653.2046413502107 }
{x=3391.5899470899471 y=1719.6058201058199 }
{x=2552.2247706422017 y=1813.3746177370028 }
{x=1717.0277777777778 y=1871.4444444444443 }
{x=1214.3235294117646 y=1898.3588235294117 }
{x=3205.9190476190474 y=2328.4428571428571 }
{x=2018.9355555555555 y=2442.0111111111109 }
{x=2644.6023102310228 y=2627.8696369636964 }
{x=3619.5897435897432 y=2628.8589743589741 }
{x=1687.1732026143791 y=2818.9313725490197 }
{x=2708.9143302180682 y=3131.5031152647975 }

Я получаю ошибку перепроецирования в 4,04 пикселя, поэтому калибровка хорошая.

Теперь, если я использую другое изображение (камера слегка сместилась):
неудачная картина

objectPointsодинаковы и в том же порядке.

imagePoints являются:

{x=2459.8866666666668 y=441.56666666666666 }
{x=3428.7755102040815 y=755.87414965986386 }
{x=1541.5804597701149 y=898.29310344827582 }
{x=2481.5166666666664 y=965.35000000000002 }
{x=3089.9254385964909 y=1160.3771929824561 }
{x=1905.8081761006288 y=1254.1981132075471 }
{x=3904.0458333333327 y=1664.0708333333332 }
{x=3384.4035087719299 y=1725.4824561403507 }
{x=2539.3900709219856 y=1810.2553191489362 }
{x=1708.0555555555554 y=1860.3282828282827 }
{x=1211.4629629629630 y=1882.4382716049381 }
{x=3190.0820105820103 y=2336.2037037037035 }
{x=2001.1436781609195 y=2430.5766283524904 }
{x=2621.9691358024693 y=2626.6810699588477 }
{x=3603.0503875968989 y=2645.9341085271317 }
{x=1665.5180180180180 y=2799.5330330330326 }
{x=2676.5030864197529 y=3133.2870370370370 }

Я получаю ошибку перепроецирования в 1112,33 пикселей, поэтому калибровка не очень хорошая.

В чем проблема с моим кодом?

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]