Лучшие способы создания прямоугольной маски с помощью openCV

Создание маски в 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;   

Предоставляет ли openCV какую-либо встроенную функцию для создания такой маски? Создать функцию для этой задачи тривиально, но функция openCV всегда быстрее, чем наивные коды ручной работы.


person StereoMatching    schedule 08.08.2013    source источник


Ответы (2)


конечно, есть более простой способ, используйте оператор roi:

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

сделано!

person berak    schedule 08.08.2013
comment
Для тех, кто хочет визуализировать маску, лучше всего установить значения 255 вместо 1, при условии, что маска используется только как логическая маска. - person zanbri; 11.04.2017

Если кто-то хочет создать непрямоугольную маску, а затем применить ее к изображению, посмотрите здесь:

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

«черный» — это изображение, где мы, наконец, получим результат, вырезав неправильный ROI из исходного изображения.

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

"Маска" представляет собой мат, инициализированный исходным изображением того же размера и заполненный 0. Маска мата(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 );

В конце скопируйте замаскированную часть / ROI из исходного изображения (origImag) и вставьте часть ROI из исходного изображения (используя маску) в изображение с именем «черный».

origImag.copyTo(black,mask);
person Spandan    schedule 24.12.2017