2013-08-08 19 views
16

Tworzenie maski w OpenCVLepsze sposoby tworzenia prostokątną maskę przez 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 dostarczyć nam żadnej kompilacji w funkcji aby utworzyć maskę takiego? Jest trywialny utworzyć funkcję fot tego zadania, ale funkcja OpenCV zawsze szybciej niż naiwnych kodów rzemiosła

Odpowiedz

42

pewno jest łatwiejszy sposób, użyć operatora ROI:

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

gotowe!

+0

Dla tych, którzy chcą wizualizować maskę, najlepiej ustawić wartości na '255' zamiast' 1', pod warunkiem, że maska ​​jest używana tylko jako maska ​​boolowska. – zanbri

0

Jeśli ktoś szuka tworzenia non prostokątną maskę, a następnie zastosować je na obrazie, a następnie spojrzeć tutaj:

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; 
    } 

„czarny” jest obrazem, gdzie będziemy w końcu uzyskać wynik przez przycinanie nieregularnego ROI z oryginalnego obrazu.

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

przycisków "maska" jest matą, inicjuje się jako tego samego rozmiaru pierwotnego obrazu i wypełnione 0. mat maski (origImag.rows, origImag.cols, CV_8UC1 CV :: skalarny (0)) ;

Umieszczenie współrzędne w lewo kierunku

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); 

Teraz generowania maski faktycznie

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

Na koniec skopiuj zamaskowaną część/ROI z oryginalnego obrazu (origImag) i wklej na część ROI z oryginalnego obrazu (przy użyciu maski) na obraz o nazwie "czarny"

Powiązane problemy