私はopencvを使用していますが、uncompressPointsを機能させることができないようです。返されるマトリックスには、NaN値しかありません。
//newKeyPoints is std::vector<cv::KeyPoint>, and it's values are valid
cv::Mat src = cv::Mat(1,newKeyPoints.size(),CV_32FC2);
int i = 0;
for (std::vector<cv::KeyPoint>::iterator it = newKeyPoints.begin(); it != newKeyPoints.end(); it++){
src.at<cv::Vec2f>(0,i)[0] = (*it).pt.x;
src.at<cv::Vec2f>(0,i)[1] = (*it).pt.y;
i++;
}
cv::Mat norm = cv::Mat(1,newKeyPoints.size(),CV_32FC2);
//Note: fx, fy, cx, cy... k3 are all global constants declared when initialized
cv::Mat cameraMatrix = cv::Mat(3, 3, CV_32F);
cameraMatrix.at<double>(0,0) = fx; //double fx = 354.65
cameraMatrix.at<double>(1,0) = 0;
cameraMatrix.at<double>(2,0) = 0;
cameraMatrix.at<double>(0,1) = 0;
cameraMatrix.at<double>(1,1) = fy; //double fy = 355.66
cameraMatrix.at<double>(2,1) = 0;
cameraMatrix.at<double>(0,2) = cx; //double cx = 143.2
cameraMatrix.at<double>(1,2) = cy; //double cy = 173.6
cameraMatrix.at<double>(2,2) = 1;
cv::Mat distCo = cv::Mat(1, 5, CV_32F);
distCo.at<double>(0,0) = k1; //double k1 = .005
distCo.at<double>(0,1) = k2; //double k2 = .002
distCo.at<double>(0,2) = p1; //double p1 = -.009
distCo.at<double>(0,3) = p2; //double p2 = -.008
distCo.at<double>(0,4) = k3; //double k3 = -.03
cv::undistortPoints(src, norm, cameraMatrix, distCo);
for (int p = 0; p<newKeyPoints.size(); p++){
printf("%f, %f \n",norm.at<Vec2f>(0,p)[0], norm.at<Vec2f>(0,p)[1]);
}
印刷される値は常に「nan、nan」です。また、標準をstd :: vectorとして使用してみましたが、同じことが返されました。src、cameraMatrix、およびdistCoの値も、メソッドが呼び出された後も変更されないままであるため(値を出力してテストしました)、uncompressPointsにすべての正しい情報を提供していると確信しています。私はcv::Matを間違って使用していますか、貧弱なフォームを使用していますか、それともこれはopencvのバグですか?ここから何をすべきかについての洞察をいただければ幸いです。
アイザック