Подтвердить что ты не робот

Применить маску к изображению в OpenCV?

У меня есть двоичная маска, которую я хочу постоянно применять к цветному изображению, как бы это сделать? Бинарная маска должна быть предпочтительно постоянной, так как я не хочу повторно применять маску к изображению каждый раз, когда я вызываю функцию.

Примеры базового кода будут оценены. Если вы используете код, объясните код, а не просто разместите его.

Спасибо

4b9b3361

Ответ 1

Вы не применяете двоичную маску к изображению. Вы (необязательно) используете двоичную маску в вызове функции обработки, чтобы сообщить функции, какие пиксели изображения вы хотите обработать. Если я полностью неверно истолковал ваш вопрос, вы должны добавить более подробную информацию, чтобы уточнить.

Ответ 2

В то время как ответ @perrejba правильный, он использует устаревшие функции стиля C. Поскольку вопрос отмечен С++, вы можете использовать метод вместо этого:

inputMat.copyTo(outputMat, maskMat);

Все объекты имеют тип cv::Mat.

Помните, что маскирование является двоичным. Любое ненулевое значение в маске интерпретируется как "сделать копию". Даже если маска представляет собой изображение в оттенках серого.

Также имейте в виду, что функция .copyTo() не очищает вывод перед копированием.

Если вы хотите постоянно изменять исходное изображение, вам необходимо выполнить дополнительную копию/клон/присвоение. Функция copyTo() не определена для перекрывающихся изображений ввода/вывода. Таким образом, вы не можете использовать то же изображение, что и вход и выход.

Ответ 3

Вы можете использовать маску для копирования только области, представляющей интерес для исходного изображения, в пункт назначения:

cvCopy(origImage,destImage,mask);

где mask должен быть 8-битным одноканальным массивом.

Подробнее в Документы OpenCV

Ответ 4

Вот некоторый код для применения бинарной маски в последовательности видеофрагментов, полученной с веб-камеры. комментировать и раскомментировать строку bitwise_not (Mon_mask, Mon_mask); "и увидеть эффект.

Bests Ахмед.

#include "cv.h"      // include it to used Main OpenCV functions.
#include "highgui.h" //include it to use GUI functions.

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    int c;

int radius=100;
      CvPoint2D32f center;
    //IplImage* color_img;
      Mat image, image0,image1; 
        IplImage *tmp;
    CvCapture* cv_cap = cvCaptureFromCAM(0);

    while(1)  {
        tmp = cvQueryFrame(cv_cap); // get frame
          // IplImage to Mat
            Mat imgMat(tmp);
            image =tmp; 



    center.x = tmp->width/2;
    center.y = tmp->height/2;

         Mat Mon_mask(image.size(), CV_8UC1, Scalar(0,0,0));


        circle(Mon_mask, center, radius, Scalar(255,255,255), -1, 8, 0 ); //-1 means filled

        bitwise_not(Mon_mask,Mon_mask);// commenté ou pas = RP ou DMLA 





        if(tmp != 0)

           imshow("Glaucom", image); // show frame

     c = cvWaitKey(10); // wait 10 ms or for key stroke
    if(c == 27)
        break; // if ESC, break and quit
    }
    /* clean up */
    cvReleaseCapture( &cv_cap );
    cvDestroyWindow("Glaucom");

}