Cara yang lebih baik untuk membuat topeng persegi panjang dengan openCV

Membuat topeng di 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;   

Apakah openCV memberi kita fungsi bawaan untuk membuat topeng seperti ini? Membuat fungsi untuk tugas ini adalah hal yang sepele, tetapi fungsi openCV selalu lebih cepat daripada kode buatan tangan yang naif


person StereoMatching    schedule 08.08.2013    source sumber


Jawaban (2)


tentu, ada cara yang lebih mudah, gunakan operator roi:

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

Selesai!

person berak    schedule 08.08.2013
comment
Bagi mereka yang ingin memvisualisasikan mask, sebaiknya tetapkan nilainya ke 255 daripada 1, asalkan mask hanya digunakan sebagai mask boolean. - person zanbri; 11.04.2017

Jika seseorang ingin membuat topeng non-persegi panjang dan kemudian menerapkannya pada gambar, lihat di sini:

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

"hitam" adalah gambar yang pada akhirnya kita akan memperoleh hasilnya dengan memotong ROI yang tidak beraturan dari gambar aslinya.

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

"Mask" adalah Mat, diinisialisasi dengan ukuran yang sama dengan gambar asli dan diisi dengan 0. Mat mask(origImag.rows, origImag.cols, CV_8UC1, cv::Scalar(0));

Meletakkan koordinat pada arah ANTICLOCKWISE

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

Sekarang sebenarnya menghasilkan topeng

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

Pada akhirnya salin bagian bertopeng/ROI dari gambar asli (origImag) dan tempelkan bagian ROI dari gambar asli (menggunakan topeng) ke dalam gambar yang diberi nama "hitam"

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