2013-08-08 11 views
16

Erstellen einer Maske in OpenCVbessere Möglichkeiten, um eine rechteckige Maske von OpenCV

 /** result I want 
      0 0 0 0 0 0 0 0 
      0 0 0 0 0 0 0 0 
      0 0 1 1 1 1 0 0 
      0 0 1 1 1 1 0 0 
      0 0 1 1 1 1 0 0 
      0 0 1 1 1 1 0 0 
      0 0 0 0 0 0 0 0 
      0 0 0 0 0 0 0 0 
     */  
cv::Mat mask = cv::Mat::zeros(8, 8, CV_8U); 
std::cout<<"before : \n"<<mask<<std::endl; 
for(int i = 2; i != 6; ++i) 
{ 
    auto ptr = mask.ptr<uchar>(i) + 2; 
    for(int j = 0; j != 4; ++j) 
    { 
     *ptr++ = 1; 
    } 
} 
std::cout<<"after : \n"<<mask<<std::endl; 

Do OpenCV bieten uns Akkumulationen in Funktion zum Erstellen einer Maske wie diese zu erstellen? Es ist trivial, eine Funktion fot diese Aufgabe, aber die Funktion von OpenCV immer schneller als naive handwerklich Codes

Antwort

42

sicher, gibt es einen einfacheren Weg, verwenden Sie den roi Betreiber zu erstellen:

cv::Mat mask = cv::Mat::zeros(8, 8, CV_8U); // all 0 
mask(Rect(2,2,4,4)) = 1; 

gemacht!

+0

Wenn Sie die Maske visualisieren möchten, setzen Sie die Werte am besten auf 255 statt auf 1, vorausgesetzt, die Maske wird nur als boolesche Maske verwendet. – zanbri

0

Wenn jemand sucht eine nicht rechteckige Maske erstellen und dann es dann einen Blick auf das Bild anzuwenden hier:

Mat& obtainIregularROI(Mat& origImag, Point2f topLeft, Point2f topRight, Point2f botLeft, Point2f botRight){ 

     static Mat black(origImag.rows, origImag.cols, origImag.type(), cv::Scalar::all(0)); 
     Mat mask(origImag.rows, origImag.cols, CV_8UC1, cv::Scalar(0)); 
     vector< vector<Point> > co_ordinates; 
     co_ordinates.push_back(vector<Point>()); 
     co_ordinates[0].push_back(topLeft); 
     co_ordinates[0].push_back(botLeft); 
     co_ordinates[0].push_back(botRight); 
     co_ordinates[0].push_back(topRight); 
     drawContours(mask,co_ordinates,0, Scalar(255),CV_FILLED, 8); 

     origImag.copyTo(black,mask); 
     return black; 
    } 

„black“ ist das Bild, in dem wir das Ergebnis schließlich erhalten wird durch Ausschneiden der unregelmäßigen ROI aus dem Originalbild.

static Mat black(origImag.rows, origImag.cols, origImag.type(), cv::Scalar::all(0)); 

Der "Maske" ist eine Matte, als die gleiche Größe des ursprünglichen Bildes initialisiert und mit 0 Mat Maske gefüllt (origImag.rows, origImag.cols, CV_8UC1, cv :: Scalar (0)) ;

Setzen der Koordinaten in GEGEN DEN UHRZEIGERSINN Richtung

vector< vector<Point> > co_ordinates; 
    co_ordinates.push_back(vector<Point>()); 
    co_ordinates[0].push_back(topLeft); 
    co_ordinates[0].push_back(botLeft); 
    co_ordinates[0].push_back(botRight); 
    co_ordinates[0].push_back(topRight); 

nun die Maske zu erzeugen tatsächlich

drawContours(mask,co_ordinates,0, Scalar(255),CV_FILLED, 8); 

Am Ende des maskierten Teils/ROI aus dem Originalbild (origImag) kopieren und auf die Anteil der ROI vom Originalbild (unter Verwendung der Maske) in das Bild mit der Bezeichnung "Schwarz"

origImag.copyTo(black,mask); 
Verwandte Themen