• 締切済み

パノラマ画像をプログラムで生成したいのですが...

cv::Mat cv::Mat::operator ()(cv::Range,cv::Range) const' : 1 番目の引数を 'int' から 'cv::Range' に変換できません。(新しい機能 ; ヘルプを参照) 1> コンストラクタはソース型を持てません、またはコンストラクタのオーバーロードの解決があいまいです。 と表示されますが解決方法が分かりません プログラミング初心者のため分かりやすいご回答をお願いいたします 実行環境はMicrosoft Visual Studio 2008です //以下プログラム const char *WindowName = "view"; const char *WindowName2 = "view2"; //画像データの読込 IplImage* src_img = cvLoadImage("C:\\opencv\\samples\\c\\box1.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if (src_img == NULL){ return 0; } IplImage* dst_img = cvLoadImage("C:\\opencv\\samples\\c\\box3.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if (src_img == NULL){ return 0; } //変換 cv::Mat img1(src_img); cv::Mat img2(dst_img); //特徴点抽出用のグレー画像用意 cv::Mat grayImg1, grayImg2; cv::cvtColor(img1, grayImg1, CV_BGR2GRAY); cv::normalize(grayImg1, grayImg1, 0, 255, cv::NORM_MINMAX); cv::cvtColor(img2, grayImg2, CV_BGR2GRAY); cv::normalize(grayImg2, grayImg2, 0, 255, cv::NORM_MINMAX); cv::imshow ( WindowName, grayImg1 ); cv::imshow ( WindowName2, grayImg2 ); //SURF cv::SurfFeatureDetector detector(100); cv::SurfDescriptorExtractor extractor; //画像から特徴点を検出 std::vector <cv::KeyPoint> keypoints1; detector.detect(grayImg1, keypoints1); std::vector <cv::KeyPoint> keypoints2; detector.detect(grayImg2, keypoints2); //画像の特徴点における特徴量を抽出 cv::Mat descriptors1; extractor.compute(grayImg1, keypoints1, descriptors1); cv::Mat descriptors2; extractor.compute(grayImg2, keypoints2, descriptors2); //特徴点の対応付け std::vector<cv::DMatch> matches; cv::FlannBasedMatcher matcher; matcher.match(descriptors1, descriptors2, matches); // 対応点をstd::vectorに格納 std::vector< cv::Vec2f > points1( matches.size() ); std::vector< cv::Vec2f > points2( matches.size() ); for( size_t i = 0 ; i < matches.size() ; ++i ) { points1[ i ][ 0 ] = keypoints1[ matches[ i ].queryIdx ].pt.x; points1[ i ][ 1 ] = keypoints1[ matches[ i ].queryIdx ].pt.y; points2[ i ][ 0 ] = keypoints2[ matches[ i ].trainIdx ].pt.x; points2[ i ][ 1 ] = keypoints2[ matches[ i ].trainIdx ].pt.y; } // 画像間の平面射影変換行列を取得 cv::Mat_< float > homography = cv::findHomography( points1, points2, CV_RANSAC ); // 画像1を画像2の空間に投影 cv::Mat_< cv::Vec3b > result; cv::warpPerspective( grayImg1, result, homography,grayImg1.size(), grayImg1.rows ); // 画像2を結果画像にコピー for( int y = 0 ; y < grayImg2.rows ; ++y ) { for( int x = 0 ; x < grayImg2.cols ; ++x ) { result( y, x ) = grayImg2( y, x ); } } // モザイキング結果を表示 cv::imshow( "Mosaicing", result ); cv::waitKey();

みんなの回答

  • honor
  • ベストアンサー率35% (25/71)
回答No.1

operator ()の引数の方が違うように見えます。 >result( y, x ) = grayImg2( y, x ); これですかね? 調べて見たところ、 Mat Mat::operator()( Range rowRange, Range colRange) const Mat Mat::operator()( const Rect& roi ) const Mat Mat::operator()( const Ranges* ranges) const この二つは矩形部分行列の抽出であってコピーではないようです。 yとxを入れて何をコピーしたいのか良く分かりませんが、行列のコピーであればそのまま代入するかclone()やcopyToを使うようです。

toronnto89
質問者

補足

回答ありがとうございます resultにgrayImg2の中でresultと重複している箇所をコピーすることで一つの画像にしようとしていました copytoを試したところ、cv::Mat' のメンバではないと表示されました 使ったことのない関数ですのでもう少し理解を進めることにします