2011-08-15 78 views
1

私はOpenCvを初めて使用しており、小さなプロジェクトに使用しています。OpenCVの反転塗りつぶし画像

私は、画像内の矩形領域を除いて、1つのチャネル画像全体を塗りつぶすつもりです。

私には2つの問題があります。

1)シングルチャンネル画像を黒で塗りつぶす。 (シングルチャンネルでは動作しません)2)イメージ内の矩形領域を除くイメージ全体に塗りつぶしを実行します。

すべてのソリューションはありますか?

+1

一般的である必要はありますか?小さなプロジェクトの場合にのみ、私はちょうど2つのネストされたforループを使い、 'if'テストでそれが長方形の内側にあるかどうかをテストし、イメージを繰り返します。 – user786653

答えて

3

ここでは、1つのチャンネルを黒で塗りつぶす方法と、画像をマスクで黒に設定する方法を示すプログラムです。

#include <iostream> 
#include "opencv2/core/core.hpp" 
#include "opencv2/highgui/highgui.hpp" 

int main(int argc, const char * argv[]) { 

    cv::Mat image; 
    image = cv::imread("../../lena.jpg", CV_LOAD_IMAGE_GRAYSCALE); 

    if (!image.data) { 
     std::cout << "Image file not found\n"; 
     return 1; 
    } 

    cv::namedWindow("original"); 
    cv::imshow("original", image); 

    //Define the ROI rectangle 
    cv::Rect ROIrect(100, 100, 200, 200); 

    //Create a deep copy of the image 
    cv::Mat fill(image.clone()); 
    //Specify the ROI 
    cv::Mat fillROI = fill(ROIrect); 
    //Fill the ROI with black 
    fillROI = cv::Scalar(0); 

    cv::namedWindow("fill"); 
    cv::imshow("fill", fill); 
    cvMoveWindow("fill", 500, 40); 

    //create a deep copy of the image 
    cv::Mat inverseFill(image.clone()); 
    //create a single-channel mask the same size as the image filled with 1 
    cv::Mat inverseMask(inverseFill.size(), CV_8UC1, cv::Scalar(1)); 
    //Specify the ROI in the mask 
    cv::Mat inverseMaskROI = inverseMask(ROIrect); 
    //Fill the mask's ROI with 0 
    inverseMaskROI = cv::Scalar(0); 
    //Set the image to 0 in places where the mask is 1 
    inverseFill.setTo(cv::Scalar(0), inverseMask); 

    cv::namedWindow("inverseFill"); 
    cv::imshow("inverseFill", inverseFill); 
    cvMoveWindow("inverseFill", 1000, 40); 
    // wait for key 
    cv::waitKey(0); 

    return 0; 
} 
+0

これは、画像をグレースケールに変換するようですが、 – user786653

+0

グレースケールが指定されています:_I画像内の矩形領域を除いて、1つのチャンネル画像全体を塗りつぶすつもりです。また、 'CV_LOAD_IMAGE_GRAYSCALE'を省略すると、 'imread'への呼び出しから始まります。 – SSteve

+0

申し訳ありませんが、私は何らかの理由で、1つのチャンネルのみをクリアしたいというOPとして解釈しました。 +1( 'libcv-dev'と友人がいるubuntuの誰かのためのサイドノート:インクルードを' に変更した後、 'g ++ $(pkg-config opencv --cflags --libs)'を使ってコンパイルしたいでしょう。 'と' ') – user786653

0

ネストされたループは実際には最も速い方法でしょう。

それ以外の場合は、cvZero(すべて黒)を使用してクリアされた同じサイズのバッファを作成することを検討してください。次に、あなたが気にする領域にsetROIを、一時バッファにcvCopyを設定します。

cvAndを使用したビットマスクもすばらしいクリーンなソリューションです。

関連する問題