

入力画像に対してcv::warpperspectiveTransform()によってホモグラフィー行列を適用したいのですが、  
メモリアクセス違反が発生してしまいます。  
[OpenCV warpperspective](https://stackoverflow.com/questions/6087241/opencv-
warpperspective)を参考に色々試してみましたがどうも上手く行きません。  
助言をいただけないでしょうか。

[code]

    cv::Mat src_image = cv::imread("image.png"); // 入力画像
    
    cv::Mat src_corner = cv::Mat(4, 1, CV_32FC2); // 入力画像の四隅
    cv::Mat dst_corner = cv::Mat(4, 1, CV_32FC2); // 出力画像の四隅 
    for (int i = 0; i < 2; ++i) {
            for (int j = 0; j < 2; ++j) {
                    src_corner.at<cv::Vec2f>(i*2+j, 0)[0] = src_image.cols * j;
                    src_corner.at<cv::Vec2f>(i*2+j, 0)[1] = src_image.rows * i;
            }
    }
    
    // ホモグラフィー行列homographyはあらかじめ適切に計算済み
    
    // 入力画像の四隅の点をホモグラフィー変換
    cv::perspectiveTransform(src_corner, dst_corner, homography);
    
    // ホモグラフィー変換によって負の座標を持つ点を補正
    cv::Mat h;
    cv::Rect br;
    {
            br = cv::boundingRect(dst_corner);
            cv::Mat offset_mat = cv::Mat::eye(3, 3, CV_32FC1);
            offset_mat.at<float>(0, 2) -= br.x;
            offset_mat.at<float>(1, 2) -= br.y;
            h = offset_mat * homography;
    }
    
    // ホモグラフィー変換
    cv::Mat dst_image;
    cv::warpPerspective(src_image, dst_image, h, br.rect);
    
[/code]


CC BY-SA 3.0
2014-12-30T10:48:05.813
2831
2014-12-30T12:44:27.740
2017-05-23T12:38:55.250
-1
312
question
c++ c++11 opencv
OpenCVにおける画像へのホモグラフィー変換の適用


自己解決したので、後でご覧になる方のために残しておきます。

問題は入力画像のデータ型がCV_8UC1だったからで、CV_32FC1に変更したら正常に動作しました。

[code]

    // データ型の変換: CV_8UC1 -> CV_32FC1
    cv::Mat src_uchar = cv::imread("image.png"); // 入力画像(CV_8UC1)
    cv::Mat src_image;
    src_uchar.convertTo(src_image, CV_32FC1);    // 型変換(-> CV_32FC1)
    
[/code]

また、ホモグラフィー変換後の画像dst_imageに対してメモリを確保しておく必要がありました。
サイズに関しては疑問が残りますが、これで正常に動作しています。

[code]

    // ホモグラフィー変換
    cv::Mat dst_image = cv::Mat(br.br().y, br.br().x, CV_32FC1); // メモリの確保
    cv::warpPerspective(src_image, dst_image, h, br.rect);
    
[/code]


CC BY-SA 3.0
2014-12-30T12:44:27.740
2836
2014-12-30T12:44:27.740
312
2831
answer