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

OpenCV实现批量图片加水印

2011-11-30 21:16 501 查看
CSDN的博客没水印功能真不方便

用OPENCV简陋地实现了一下

才发现以前用的全都是C风格OpenCV,

而OpenCV的C接口与C++接口的差异真是非常大,今天这个程序一不小心用了C风格,在Cstring和C++string转换上琢磨了半天。

为了规范,又重新C++风写了一遍

其实就是个putText函数

针对C++的接口中putText函数定义为

void putText(Mat&
img, const string& text, Point org, int
fontFace, double fontScale, Scalar color, int
thickness=1, int lineType=8, bool bottomLeftOrigin=false
)

参数为

img – 图像矩阵

text – string型 文字内容
org – 文字坐标,以左下角为原点

fontFace – 字体类型 (包括 FONT_HERSHEY_SIMPLEX,
FONT_HERSHEY_PLAIN,
FONT_HERSHEY_DUPLEX, FONT_HERSHEY_COMPLEX,
FONT_HERSHEY_TRIPLEX,
FONT_HERSHEY_COMPLEX_SMALL,
FONT_HERSHEY_SCRIPT_SIMPLEX, or
FONT_HERSHEY_SCRIPT_COMPLEX,)
fontScale –字体大小
color – 字体颜色

thickness – 字体粗细
lineType – Line type. See the line for details.
bottomLeftOrigin – When true, the image data origin is at the bottom-left corner. Otherwise, it is at the top-left corner.

简单意义的打水印无非就是加个文字

void logo(string filename)
{
if(filename.substr(filename.size()-4,4)!=".jpg") return;
Mat img = imread(filename);

cout<<"converting  "<<filename<<"  to  ";

putText(img, "blog.csdn.net/boksic" , Point(0, int(img.rows*0.9)), CV_FONT_HERSHEY_COMPLEX,img.cols/400, cvScalar(200, 200, 200, 0));

filename.insert(0,"new_");
cout<<filename<<endl;
imwrite(filename,img);
}


还有就是遍历目录下文件,获得文件名,这样才能批量

vector<string>  get_filelist(char *foldname)
{
vector<string> flist;
HANDLE file;
WIN32_FIND_DATA fileData;
char line[1024];
wchar_t fn[1000];
mbstowcs(fn,(const char*)foldname,999);
file = FindFirstFile(fn, &fileData);
FindNextFile(file, &fileData);
while(FindNextFile(file, &fileData)){
wcstombs(line,(const wchar_t*)fileData.cFileName,259);
flist.push_back(line);
}
return flist;
}


剩下的用vector就可以
vector<string> filelist=get_filelist(".\\*.*");
for(vector<string>::iterator p=filelist.begin();p!= filelist.end();logo(*(p++)));


运行效果



打水印后的图片

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