2

OpenCV で (OpenCVSharp のラッパーを介して) 画像の歪みを取り除こうとしていますが、マトリックスの正しい形式を理解するのに問題があります。予想外の結果。

私が使用する別のソフトウェアから、次のデータを取得します(そのソフトウェアは、これらのパラメーターで画像の歪みを元に戻すので、これは正しいはずです)

    <sensor id="0" label="RP_OV5647 (3.5976 mm)" type="frame">
      <resolution width="2592" height="1944"/>
      <property name="focal_length" value="3.5975999999999999e+000"/>
      <property name="fixed" value="false"/>
      <calibration type="frame" class="adjusted">
        <resolution width="2592" height="1944"/>
        <fx>2.5667779156627239e+003</fx>
        <fy>2.5654169232963172e+003</fy>
        <cx>1.2933905910821311e+003</cx>
        <cy>9.6694162774618212e+002</cy>
        <skew>2.9824815660771562e+000</skew>
        <k1>9.1041365324307497e-002</k1>
        <k2>-4.0485507081497402e-001</k2>
        <k3>3.3943759073230600e-001</k3>
        <p1>3.4409596859645629e-004</p1>
        <p2>-3.9472652058529605e-005</p2>
      </calibration>
    </sensor>

次のコードを使用して画像の歪みを解消しています。固有のマトリックスは問題ありません(歪みを適用しない場合に期待される結果が得られます)が、予想されるレイアウトについて理解していることから、歪みマトリックスが問題を引き起こしています(何も見つかりませんでした)サンプルですが、これは OpenCV ソースから収集したものです) k1k2p1p2 を使用した 4X1 マトリックスが機能するはずなので、構成ファイルに次のように記述します。

<?xml version="1.0"?>
<opencv_storage>
   <intrinsic type_id="opencv-matrix">
   <rows>3</rows>
   <cols>3</cols>
   <dt>f</dt>
   <data>
      1293.3905910821311 0. 966.94162774618212 0. 2566.7779156627239 2565.4169232963172 0. 0. 1.
   </data>
 </intrinsic>
 <distortion type_id="opencv-matrix">
   <rows>1</rows>
   <cols>5</cols>
   <dt>f</dt>
   <data>
  0.091041365324307497 -0.40485507081497402 0.00034409596859645629 -0.000039472652058529605 0.33943759073230600
   </data>
 </distortion>

コード :

            using (IplImage srcImg = new IplImage(img.Path, LoadMode.Color))
            using (IplImage dstImg = srcImg.Clone())
            {
                CvMat intrinsic, distortion;
                using (CvFileStorage fs = new CvFileStorage("camera.xml", null, FileStorageMode.Read))
                {
                    CvFileNode param = fs.GetFileNodeByName(null, "intrinsic");
                    intrinsic = fs.Read<CvMat>(param);
                    param = fs.GetFileNodeByName(null, "distortion");
                    distortion = fs.Read<CvMat>(param);
                }
                Cv.Undistort2(srcImg, dstImg, intrinsic, distortion);
                dstImg.SaveImage(new System.IO.FileInfo(img.Path).Name);
            }

しかし、私は完全に歪んだ画像 (Whirlpool) を取得しています。行列の順序が間違っていますか? 名前付きパラメーターから作成されたマトリックスを含むコード サンプル (見つけられなかった) はありますか?

4

2 に答える 2

3

パラメータについてはskewわかりませんが、このコードでは、提供された画像とはまったく異なる結果が得られます(ただし、「正しい」修正画像とは異なります)

int main()
{
    // camera resolution
    cv::Mat input= cv::imread("../inputData/distorted1.jpg");


    cv::Mat distCoeff;
    distCoeff = cv::Mat::zeros(8,1,CV_64FC1);

    // indices: k1, k2, p1, p2, k3, k4, k5, k6 
    // your coefficients here!
    double k1 = 9.1041365324307497e-002;
    double k2 = -4.0485507081497402e-001;
    double p1 = 3.4409596859645629e-004;
    double p2 = -3.9472652058529605e-005;
    double k3 = 3.3943759073230600e-001;
    double k4 = 0;
    double k5 = 0;
    double k6 = 0;

    distCoeff.at<double>(0,0) = k1;
    distCoeff.at<double>(1,0) = k2;
    distCoeff.at<double>(2,0) = p1;
    distCoeff.at<double>(3,0) = p2;
    distCoeff.at<double>(4,0) = k3;
    distCoeff.at<double>(5,0) = k4;
    distCoeff.at<double>(6,0) = k5;
    distCoeff.at<double>(7,0) = k6;


    // camera intrinsics
    cv::Mat cam1;
    cam1 = cv::Mat::eye(3,3,CV_32FC1);
    cam1.at<float>(0,0) = 2.5667779156627239e+003;
    //cam1.at<float>(0,1) = 0;
    cam1.at<float>(0,1) = 2.9824815660771562e+000; // skew?
    cam1.at<float>(0,2) = 1.2933905910821311e+003;

    cam1.at<float>(1,0) = 0;
    cam1.at<float>(1,1) = 2.5654169232963172e+003;
    cam1.at<float>(1,2) = 9.6694162774618212e+002;

    // direct undistort:
    cv::Mat output;
    cv::undistort(input, output, cam1,distCoeff);


    cv::imshow("input", input);
    cv::imshow("distCorr-direct", output);

    cv::waitKey(-1);

    return 0;
}
于 2015-09-28T13:18:56.637 に答える
2

取得したキャリブレーションは 5 つのパラメーターk1, k2, k3, p1, p2用であるため、歪みを補正するためにそれらすべてを使用する必要があります。現在、スキップしてk3います。

k3の値を構成ファイルに追加して、distortionパラメータにディメンションを持たせてみてください1x5。順序は にする必要があることに注意してくださいk1, k2, p1, p2, k3

于 2015-09-28T11:53:04.690 に答える