Применить маску к изображению в OpenCV?
У меня есть двоичная маска, которую я хочу постоянно применять к цветному изображению, как бы это сделать?
Бинарная маска должна быть предпочтительно постоянной, так как я не хочу повторно применять маску к изображению каждый раз, когда я вызываю функцию.
Примеры базового кода будут оценены. Если вы используете код, объясните код, а не просто разместите его.
Спасибо
Ответы
Ответ 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");
}