OpenCV实现批量图片加水印
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就可以 vector<string> filelist=get_filelist(".\\*.*"); for(vector<string>::iterator p=filelist.begin();p!= filelist.end();logo(*(p++)));
运行效果
打水印后的图片