パノラマ画像をプログラムで生成したいのですが...
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();
お礼
ありがとうございます。今は売ってなかったようです