2

イメージ (cv::Mat) とマスクとして表示できる ROI があります。元の画像に ROI をブレンドして表示したいと考えています。

私のマスクは元の画像よりも小さく、各要素は画像内のブロックを表しています。私のマスクがこれだとします(私のマスクは長方形ではないことに注意してください)

0  0  1
1  1  1
0  0  0

次に、(マスク== 1)の部分をそのままにして、残りの部分を色とブレンドしたいと思います。これは私が持っているコードです

cv::Mat blocks = image.clone;
uint npixcol = 32;
uint npixrow = 32;
for (uint ri = 0; ri < 480; ++ri)
    for (uint ci = 0; ci < 640; ++ci)
        {
        if (mask[ri * 640 + ci])
            cv::rectangle(blocks, cv::Rect(ci * npixcol, ri * npixrow, npixcol, npixrow), cv::Scalar(0, 0, 0), CV_FILLED, 8, 0);
        }
cv::addWeighted(image, 0.5, blocks, 0.5, 0, image, -1);

余分な「クローン」コマンドを使用せずにこれを行うにはどうすればよいですか?それはあまりパフォーマンスが高くないためです...

より明確にするために; これは私が欲しいものの例です (色はあまり重要ではありません)!ここに画像の説明を入力

4

3 に答える 3

1

コメントに基づいて、元の画像と同じ寸法のマスクを作成できれば、イテレータを使用して元の画像のピクセル値を直接変更できます。スタンドアロンの例を次に示します。

#include <cstdlib>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


int
main(int argc, char *argv[])
{
  cv::Mat image = cv::imread(argv[1]);
  cv::Mat mask = cv::Mat::zeros(image.size(), CV_8U);
  // let's put some 1 in my test mask.
  cv::Mat roi = mask(cv::Rect(0,0,mask.cols/2, mask.rows/2));
  roi = 1;

  cv::Vec3b blue(255,0,0); // (B,G,R)
  float alpha = 0.5;
  // Let's have fun with iterators
  cv::MatConstIterator_<unsigned char> maskIter = mask.begin<unsigned char>();
  const cv::MatConstIterator_<unsigned char> maskIterEnd = mask.end<unsigned char>();
  cv::MatIterator_<cv::Vec3b> imageIter = image.begin<cv::Vec3b>();
  for (; maskIter != maskIterEnd; ++maskIter, ++imageIter) {
    if (*maskIter) {// mask == 1
      *imageIter = (1-alpha)*(*imageIter) + alpha*blue; // same as addWeighted 
    }
  }

  cv::namedWindow("image", 0);
  cv::imshow("image", image);
  cv::waitKey(0);
  return EXIT_SUCCESS;
}
于 2014-03-19T08:47:45.043 に答える
0

基本的に、ROI 内にいるかどうかを確認する必要があります。次に、元の画像へのポインターを返す必要があります。中にいない場合は、何らかの色が必要です。

Mat の独自のラッパーでそれを行うことができます。

MyMat::at(int x, int y){
    if(inRoi(x,y)){
        return original.at(x,y);
    else
        return color(0,0,0);
}

画像のサブイメージを別の画像に向けることはできないと思います。(つまり、青い画像のピクセルを元の画像にリダイレクトできないと思います)

Mat blueImage;
Rect roi;
Mat roiInImage = blueImage(roi);
roiInImage.redirect = originalImage(roi); //don't think something like this is possible
于 2014-03-18T09:01:07.860 に答える