2017-04-13 43 views
0

私は常にピクセル位置を正しい位置に歪ませないアプリケーションがあります。initUndistortRectifyMapを使用して画像ポイントを歪ませない

私は、次のコードTHWが良い結果が得られ、最初のPythonでそれを試してみました:私は++それだけでがらくたを返しますCにそのを変換しようとすると

cam_m=np.array([[2590.2742, 0, 997.78192],[0, 2582.9724, 509.76907],[0, 0, 1]]) 
dist_c=np.array([0.088253155, 0.96952456, 0.0033740622, -0.00064934365, -6.0030732]) 
map1,map2=cv2.initUndistortRectifyMap(cam_m, dist_c, None, None, (1920,1024), cv2.CV_32FC1) 

cv::initUndistortRectifyMap(this->m_cameraMatrix,this->m_distortionCoeffs, 
     cv::Mat::eye(3, 3, CV_32FC1),cv::Mat::eye(3, 3, CV_32FC1), 
     cv::Size(dimX,dimY),CV_32FC1,this->m_undistortMapX,this->m_undistortMapY); 
をしかし、私は出力が約-2.0e + 21の値が含まれているm_undistortMapXときのマップでは、大規模への道である値を返します。私は呼んでいます。 this->m_undistortMapXthis->m_undistortMapYは、クラスで宣言されていて、以前は初期化されていません。他のパラメータは、あまりにも、右を見て:Pythonでのように

[2590.2742, 0, 997.78192; 
0, 2582.9724, 509.76907; 
0, 0, 1] 
[0.088253155, 0.96952456, 0.0033740622, -0.00064934365, -6.0030732] 
1920/1024 

だから同じ

std::cout << this->m_cameraMatrix << std::endl; 
std::cout << this->m_distortionCoeffs << std::endl; 
std::cout << dimX <<"/"<<dimY<<std::endl; 

出力を、私は思いました。まだ何が間違って行くことができる任意のアイデア?

答えて

0

これを試してください。まず、最適な新しいカメラ行列newcam1を取得し、x方向とy方向のマッピング行列を見つけます。map1xmap1y。 undistort機能を使用して、最後には、は(ものPythonから、私は認めざるを得ない) `、うまく

Mat newcam1,map1x,map1y; 


newcam1 = getOptimalNewCameraMatrix(CM1, Dist1, Size(w, h), 0); 

initUndistortRectifyMap(CM1, Dist1, R1, newcam1, Size(w, h), CV_32FC1, map1x, map1y); 

undistort(img, image_undistorted, CM1, Dist1, newcam1); 
+0

をimage_undistorted私のオリジナルのカメラ行列を持つだけで正常に動作しundistort'得ることができます。私は、ビジョン/検出アルゴリズムを使って見つかった座標の歪みのない位置を調べるためのルックアップテーブルを生成したい。それはリアルタイムで、これは時間がかかりすぎるので、画像全体を歪ませない/再マッピングすることはオプションではありません。しかし、私はgetOptimalNewCameraMatrixがmap1xとmap1yにしか駄目があるという状況をどのように変えるのか見ていないのですか? – Cookie

+0

特定のピクセル座標にのみ歪み補正を適用し、それらの新しい座標を取得する必要がありますか? – Ibrahim

+0

ええ、まさに。しかし、1フレームあたり約30〜40座標の15fpsです。 – Cookie

関連する問題