您的位置:首页 > 运维架构

OpenCV中的掩码(mask)操作

2014-04-19 17:46 302 查看
今天需要对图像中的某片区域设置颜色,于是使用void cvSet( CvArr* arr, CvScalar value, const CvArr* mask=NULL )函数,对于mask参数,我想当然的认为是创建一个imageHeader,然后将其数据指针设置为目标区域的起始点,size设置为目标区域,widthStep设置为源图像一样就行了。谁知出现错误。查了下参考手册,看到这么几句话

操作掩码是8比特单通道的数组,它指定了输出数组中被改变的元素。

函数 cvSet 拷贝数量值到输出数组的每一个被mask选定的元素:

arr(I)=value if mask(I)!=0

于是猜测mask的尺寸应该和源图像一致,对于源图像而言,某个像素的颜色是否被设置取决于对应的mask数组中的那个元素的值是否为true

为true则设置,false则不设置。

于是试着将某个图像的上半部分的颜色设置为黑色

代码如下:

#include <iostream>
#include "cv.h"
#include "highgui.h"

using namespace std;

int main()
{
cvNamedWindow("SRC");
cvNamedWindow("DEST");
IplImage* img = cvLoadImage("D:\\F  Download\\Lixtary-300.png");
cvShowImage("SRC", img);
IplImage* mask = cvCreateImage(cvSize(img->width, img->height), IPL_DEPTH_8U, 1);
mask->origin = img->origin;
for(int i = 0; i<mask->height/2; i++)
{
char* ptr = mask->imageData+i*mask->widthStep;
for(int j = 0; j<mask->width; j++)
{
ptr[j] = 1;
}
}
cvSet(img, cvScalar(0, 0, 0), mask);
cvShowImage("DEST", img);
cvWaitKey();
cvReleaseImage(&img);
cvReleaseImageHeader(&mask);
cvDestroyWindow("SRC");
cvDestroyWindow("DEST");
return 0;
}


结果如下:






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: