12

#2 つの画像を読み込んでいて、2 つの画像を組み合わせた 3 番目の画像を取得したいと考えています。img_object と img_scene は同じサイズではありません。

    int main( int argc, char** argv )
        Mat combine;

        Mat img_object = imread( object_filename, CV_LOAD_IMAGE_GRAYSCALE );
        Mat img_scene = imread(  scene_filename , CV_LOAD_IMAGE_GRAYSCALE );
    if( !img_object.data || !img_scene.data )
      { std::cout<< " --(!) Error reading images " << std::endl; return -1; }


       namedWindow( "Display window oject", 0 );// Create a window for display.


       namedWindow( "Display window scene ", 0 );


       namedWindow( "Display window combine ", 0 );

       imshow( "Display window oject", img_object );
       imshow( "Display window scene", img_scene );   
       imshow( "Display window scene", combine );   
 waitKey(0);
  return 0;
  }
4

5 に答える 5

3

画像が同じサイズでない場合、combineの幅は幅の合計に等しくなりますが、高さは 2 つの画像の高さのうち大きい方でなければなりません。

組み合わせイメージを次のように定義します。

Mat combine(max(img_object.size().height, img_scene.size().height), img_object.size().width + img_scene.size().width, CV_8UC3);

Mat高さが最大の高さに等しく、幅が画像の合計幅に等しい新しいオブジェクトを作成しているだけであることに注意してください(画像間に小さな余白が必要な場合は、ここでそれを考慮する必要があります)。

combine次に、 (便利なコンストラクターを使用して)内部の各側の関心領域を定義しMat、最後に各画像を対応する側にコピーします (ここでは、オブジェクトが左側にあり、シーンが右側にあると想定しています)。

Mat left_roi(combine, Rect(0, 0, img_object.size().width, img_object.size().height));
img_object.copyTo(left_roi);
Mat right_roi(combine, Rect(img_object.size().width, 0, img_scene.size().width, img_scene.size().height));
img_scene.copyTo(right_roi);

編集: TimZaman が指摘したタイプミスを修正しました。

于 2013-08-04T16:05:01.040 に答える
3
// --------------------------------------------------------------
// Function to draw several images to one image.
// Small images draws into cells of size cellSize.
// If image larger than size of cell ot will be trimmed.
// If image smaller than cellSize there will be gap between cells.
// --------------------------------------------------------------
char showImages(string title, vector<Mat>& imgs, Size cellSize) 
{
char k=0;
    namedWindow(title);
    float nImgs=imgs.size();
    int   imgsInRow=ceil(sqrt(nImgs));     // You can set this explicitly
    int   imgsInCol=ceil(nImgs/imgsInRow); // You can set this explicitly

    int resultImgW=cellSize.width*imgsInRow;
    int resultImgH=cellSize.height*imgsInCol;

    Mat resultImg=Mat::zeros(resultImgH,resultImgW,CV_8UC3);
    int ind=0;
    Mat tmp;
    for(int i=0;i<imgsInCol;i++)
    {
        for(int j=0;j<imgsInRow;j++)
        {
            if(ind<imgs.size())
            {
            int cell_row=i*cellSize.height;
            int cell_col=j*cellSize.width;
            imgs[ind].copyTo(resultImg(Range(cell_row,cell_row+tmp.rows),Range(cell_col,cell_col+tmp.cols)));
            }
            ind++;
        }
    }
    imshow(title,resultImg);
    k=waitKey(10);
    return k;
}
于 2013-08-04T16:48:20.263 に答える
1

画像が同じサイズであると仮定すると、ループでこれを行うことができます:

Mat combine = Mat::zeros(img_object.rows,img_object.cols *2,img_object.type());
for (int i=0;i<combine.cols;i++) {
    if (i < img_object.cols) {
         combine.col(i) = img_object.col(i);
    } else {
         combine.col(i) = img_scene.col(i-img_object.col);
    }
}

私はそれをテストしませんでしたが、それはあなたがこれを行うことができる方法です

于 2013-08-04T16:02:00.043 に答える
0

複数の画像を並べてみましたが、これを試してみてください。

Mat combine = Mat::zeros(img_buff[0].rows, 
img_buff[0].cols * (int)img_index.size(), img_buff[0].type());

int cols = img_buff[0].cols;
for (int i=0;i<combine.cols;i++) {
    int fram_index = i / img_buff[0].cols;
    cout<<fram_index<<endl;   
    img_buff[fram_index].col(i % cols).copyTo(combine.col(i));
}
imshow("matching plot", combine);

ある画像から別の画像に列をコピーするときは、次のように注意してください。

A.row(j).copyTo(A.row(i));

これをしないでください:

A.row(j) = A.row(i);
于 2014-12-04T22:38:40.893 に答える