1

私はopencvの初心者です。私はこのタスクを持っています:

  1. 新しい画像を作成する

  2. 特定の画像を0,0に入れます

  3. 特定の画像をグレースケールに変換する

  4. その隣にグレースケール画像を置きます(300、0で)

これが私がしたことです。コンストラクターとすべての関数を持つクラス imagehandler があります。

cv::Mat m_image

メンバーフィールドです。

新しい画像を作成するコンストラクタ:

imagehandler::imagehandler(int width, int height)
: m_image(width, height, CV_8UC3){


}

ファイルから画像を読み取るコンストラクタ:

imagehandler::imagehandler(const std::string& fileName)
: m_image(imread(fileName, CV_LOAD_IMAGE_COLOR))
{
if(!m_image.data)
{
    cout << "Failed loading " << fileName << endl;
}

}

これはグレースケールに変換する関数です:

void imagehandler::rgb_to_greyscale(){

cv::cvtColor(m_image, m_image, CV_RGB2GRAY);

}

これは、貼り付けイメージをコピーする関数です。

//paste image to dst image at xloc,yloc
void imagehandler::copy_paste_image(imagehandler& dst, int xLoc, int yLoc){

cv::Rect roi(xLoc, yLoc, m_image.size().width, m_image.size().height);
cv::Mat imageROI (dst.m_image, roi);

m_image.copyTo(imageROI);
 }

さて、主に、これは私がやったことです:

imagehandler CSImg(600, 320); //declare the new image
imagehandler myimg(filepath);

myimg.copy_paste_image(CSImg, 0, 0);
CSImg.displayImage(); //this one showed the full colour image correctly
myimg.rgb_to_greyscale();
myimg.displayImage(); //this shows the colour image in GRAY scale, works correctly
myimg.copy_paste_image(CSImg, 300, 0);
CSImg.displayImage(); // this one shows only the full colour image at 0,0 and does NOT show the greyscaled one at ALL!

問題に見えるのは?私はこれについて何時間も頭を悩ませてきました!!!

4

1 に答える 1

2

次の問題があります。

代わりにコンストラクタで

m_image(width, height, CV_8UC3){}

あなたは書くべきです

{  
  m_image.create(width, height, CV_8UC3);  
} 

代わりに、デフォルトの構造について心配する必要はありません。

備考:

  • cvtColor が入力と出力と同じ Mat で適切に機能するかどうかはわかりません。変更する方が安全だと思います。Mat temp; cvtColor(m_image, temp, CV_...); m_image=temp;
  • m_image.empty()checkではなくを呼び出すことで、画像が空かどうかを確認できます!m_image.data。そうしないと、確信が持てません。ポインター m_image.data も、参照カウントされたリソース管理のために古くなる可能性があります。
  • カスタムデストラクタを見た以前の質問から:それは必要ありません。心配する必要はありません。
于 2012-11-23T04:58:22.497 に答える