OpenCV由汉字生成图片(透明)----可以对抗论文查重!!!
今天听说很多同志们写毕业论文重复率过高的问题,大牛说用图片代替字就行了,我就想用OpenCV实现一下看看能不能搞,果不其然还是可以的!!!主要的难点在于普通格式的图片背景不透明,需要使用背景透明的png格式图片就行。
主要思想和步骤:
1.首先配置好FreeType与OpenCV,添加编译好的lib,与include目录和CvxText.h和CvxText.cpp就行了,参考[1]
2.说一下思路,主要就是OpenCV版本的问题造成有的函数用的IplImage,而函数
//设置原图像文字
text.putText(ImageSrc, msg, cvPoint(1, size_zi), color);
只能接受IplImage格式的参数,所以保存成png,就比较麻烦了。
png格式的图片是4个通道,按照BGRA来放置,alaph就是透明通道。我们的思路就是按照原来直接给图片上叠加文字的办法,新建与文字大小相同的图片,然后二值化,按照二值模版生成新的png文字图片,有字的地方添上颜色,没字的地方设置为透明。
当然二值化算法网上搜了一个自适应阀值的算法效果非常好:参考[3]
3.生成了透明的文字图片,粘贴到论文里面,估计查询重复的系统再牛逼也是无能为力了。后序有空做一些程序界面跟字符分割的东西,可以直接卖钱了。
当然,字体跟大小,上下边距都是可以设置的,后序再往程序里面写。
实现效果:
主要代码:
- // AddChinese.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include <opencv2/core/core.hpp>
- #include <opencv2/highgui/highgui.hpp>
- #include "CvxText.h"
- #pragma comment(lib,"freetype255d.lib")
- #pragma comment(lib,"opencv_core2410d.lib")
- #pragma comment(lib,"opencv_highgui2410d.lib")
- #pragma comment(lib,"opencv_imgproc2410d.lib")
- using namespace std;
- using namespace cv;
- #define ROW_BLOCK 2
- #define COLUMN_Block 2
- // writePng.cpp : 定义控制台应用程序的入口点。
- //
- int run_test_png(Mat &mat,string image_name)
- {
- /*采用自己设置的参数来保存图片*/
- //Mat mat(480, 640, CV_8UC4);
- //createAlphaMat(mat);
- vector<int> compression_params;
- compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
- compression_params.push_back(9); //png格式下,默认的参数为3.
- try
- {
- imwrite(image_name, mat, compression_params);
- }
- catch (runtime_error& ex)
- {
- fprintf(stderr, "Exception converting image to PNG format: %s\n", ex.what());
- return 1;
- }
- fprintf(stdout, "Saved PNG file with alpha data.\n");
- waitKey(0);
- return 0;
- }
- int coloured(Mat &template_src, Mat &mat_png, CvScalar color)
- {
- for (int i = 0; i < template_src.rows; ++i)
- {
- for (int j = 0; j < template_src.cols; ++j)
- {
- Vec4b& bgra = mat_png.at<Vec4b>(i, j);
- //int temp = template_src.at<uchar>(i,j);
- if (template_src.at<uchar>(i,j)== 0)
- {
- bgra[0] = color.val[0]; //b通道
- bgra[1] = color.val[1]; //g通道
- bgra[2] = color.val[2]; //r通道
- bgra[3] = 255;//alpha通道全部设置为透明完全透明为0,否则为255
- }
- else
- {
- bgra[3] = 0;//alpha通道全部设置为透明完全透明为0,否则为255
- }
- }
- }
- return 0;
- }
- void ImageBinarization(IplImage *src)
- { /*对灰度图像二值化,自适应门限threshold*/
- int i,j,width,height,step,chanel,threshold;
- /*size是图像尺寸,svg是灰度直方图均值,va是方差*/
- float size,avg,va,maxVa,p,a,s;
- unsigned char *dataSrc;
- float histogram[256];
- width = src->width;
- height = src->height;
- dataSrc = (unsigned char *)src->imageData;
- step = src->widthStep/sizeof(char);
- chanel = src->nChannels;
- /*计算直方图并归一化histogram*/
- for(i=0; i<256; i++)
- histogram[i] = 0;
- for(i=0; i<height; i++)
- for(j=0; j<width*chanel; j++)
- {
- histogram[dataSrc[i*step+j]-'0'+48]++;
- }
- size = width * height;
- for(i=0; i<256; i++)
- histogram[i] /=size;
- /*计算灰度直方图中值和方差*/
- avg = 0;
- for(i=0; i<256; i++)
- avg += i*histogram[i];
- va = 0;
- for(i=0; i<256; i++)
- va += fabs(i*i*histogram[i]-avg*avg);
- /*利用加权最大方差求门限*/
- threshold = 20;
- maxVa = 0;
- p = a = s = 0;
- for(i=0; i<256; i++)
- {
- p += histogram[i];
- a += i*histogram[i];
- s = (avg*p-a)*(avg*p-a)/p/(1-p);
- if(s > maxVa)
- {
- threshold = i;
- maxVa = s;
- }
- }
- /*二值化*/
- for(i=0; i<height; i++)
- for(j=0; j<width*chanel; j++)
- {
- if(dataSrc[i*step+j] > threshold)
- dataSrc[i*step+j] = 255;
- else
- dataSrc[i*step+j] = 0;
- }
- }
- Mat binaryzation(Mat &src)
- {
- Mat des_gray(src.size(),CV_8UC1);
- cvtColor(src,des_gray,CV_BGR2GRAY);
- //Mat bin_mat();
- IplImage temp(des_gray);
- ImageBinarization(&temp);
- //threshold(des_gray,des_gray,150,255,THRESH_BINARY);
- imshow("二值图像",des_gray);
- return des_gray;
- }
- int generate_chinese(const int size_zi, const char *msg ,int number,CvScalar color)
- {
- //int size_zi = 50;//字体大小
- CvSize czSize; //目标图像尺寸
- float p = 0.5;
- CvScalar fsize;
- //读取TTF字体文件
- CvxText text("simhei.ttf");
- //设置字体属性 字体大小/空白比例/间隔比例/旋转角度
- fsize = cvScalar(size_zi, 1, 0.1, 0);
- text.setFont(NULL, &fsize, NULL, &p);
- czSize.width = size_zi*number;
- czSize.height = size_zi;
- //加载原图像
- IplImage* ImageSrc = cvCreateImage(czSize,IPL_DEPTH_8U,3);//cvLoadImage(Imagename, CV_LOAD_IMAGE_UNCHANGED);
- //Mat image(ImageSrc);
- //createAlphaMat(image);
- //ImageSrc = ℑ
- //IplImage temp(image);
- //ImageSrc = &temp;
- //设置原图像文字
- text.putText(ImageSrc, msg, cvPoint(1, size_zi), color);
- //显示原图像
- cvShowImage("原图", ImageSrc);
- string hanzi = msg;
- hanzi = hanzi + ".png";
- Mat chinese(ImageSrc,true);
- Mat gray = binaryzation(chinese);
- imwrite("chinese_gray.jpg",gray);
- Mat mat_png(chinese.size(),CV_8UC4);
- coloured(gray,mat_png,color);
- run_test_png(mat_png,hanzi);
- //
- ////cvSaveImage("hanzi.jpg",reDstImage);
- //run_test_png(chinese,hanzi);
- //等待按键事件
- cvWaitKey();
- return 0;
- }
- int main()
- {
- CvScalar color = CV_RGB(0,0,0);
- int size = 200;
- const char* msg = "你好a";//暂时一行字不要太长
- int number = 3;//字符个数
- generate_chinese(size,msg,number,color);
- return 0;
- }
完整工程下载:
http://download.csdn.net/detail/wangyaninglm/8486521
参考文献:
http://blog.csdn.net/fengbingchun/article/details/8029337
http://www.oschina.net/code/snippet_1447359_36028
http://blog.csdn.net/hustspy1990/article/details/6301592
OpenCV由汉字生成图片(透明)----可以对抗论文查重!!!的更多相关文章
- 论文 查重 知网 万方 paperpass
相信各个即将毕业的学生或在岗需要评职称.发论文的职场人士,论文检测都是必不可少的一道程序.面对市场上五花八门的检测软件,到底该如何选择?选择查重后到底该如何修改?现在就做一个知识的普及.其中对于中国的 ...
- PaperBye-一个可以自动改重的免费论文查重网站
推荐一个自动降重的免费论文查重软件,可自动降低论文重复率,一边修改,一边查重,免费查重网址:https://www.paperbye.com
- python简单实现论文查重(软工第一次项目作业)
前言 软件工程 https://edu.cnblogs.com/campus/gdgy/informationsecurity1812 作业要求 https://edu.cnblogs.com/cam ...
- l论文查重平台
推荐大家一个靠谱的论文检测平台.重复的部分有详细出处以及具体修改意见,能直接在文章上做修改,全部改完一键下载就搞定了.怕麻烦的话,还能用它自带的降重功能.哦对了,他们现在正在做毕业季活动, 赠送很多免 ...
- python 将windows字体中的汉字生成图片的方法
#encoding: utf-8import osimport pygame chinese_dir = '黑体常规'if not os.path.exists(chinese_dir): os.mk ...
- Opencv读取各种格式图片,在TBitmap上面重绘
//opencv读取图片 cv::Mat image; //const char *fileName = "HeadImage-UI/Photo-001.bmp"; const c ...
- 代码之间-论文修改助手v1.0版本发布
论文查重,是每个毕业生都要面临的一个令人头疼的问题,如果写论文不认真,很可能导致查重红一大片. 之前有帮助一些朋友修改论文降低重复率,做了一些工作后发现,国内的查重机构,如知网.维普等,大多数是基于关 ...
- 【HanLP】资料链接汇总
Java中调用HanLP配置 HanLP自然语言处理包开源官方文档 了解HanLP的全部 自然语言处理HanLP 开源自由的汉语言处理包主页 GitHub源码 基于hanLP的中文分词详解-MapRe ...
- 高校手机签到系统——第一部分Authority权限系统(下)
很抱歉,之前寝室光纤断了,所以到现在才更新这个系列的第二篇博客.点击访问高校手机签到系统——第一部分Authority权限系统(上) 这几天我反思了一下上一篇写博上的方式,一味的贴代码式的,是否应该更 ...
随机推荐
- java.io.FileNotFoundException: D:\Program%20Files\Apache%20Software%20Foundation\Tomcat%205.0\webapp
慢慢把以前遇到过的问题一点点发出来,以前做的笔记比较杂: java.io.FileNotFoundException: D:\Program%20Files\Apache%20Software%20F ...
- (译)Objective-C 类属性
翻译自:Objective-C Class Properties 译者:Haley_Wong 由于Swift 3.0 出了太多令人兴奋的新特性,人们很容易忽略 Objective-C中的小改动.苹果展 ...
- Android 结合实际项目学会ListView局部刷新和相关知识《一》
转载本专栏博客,请注明出处:道龙的博客 最近在公司参与的项目中有一个界面需要做局部UI更新处理,把其化烦为简为Demoi形式写在这里.我们还是运行该Demo,知道ListView局部刷新的使用场景:( ...
- Swift基础之UIPickerView和小animate的使用
写一个简单的UIPickerView的使用Demo,比较简单,其中和一个小动画的结合使用 UIPickerView的使用基本上跟OC语言中的一样,就是写法的样式问题,想必开发过OC的应该不需要多讲了, ...
- 快速了解 Robot Operating System(ROS) 机器人操作系统
http://www.ros.org/ 关于ROS About ROS http://www.ros.org/about-ros/ 机器人操作系统(ROS)是用于编写机器人软件的灵活框架.目的在简化 ...
- JAVA面向对象-----访问修饰符
访问修饰符是用来控制类.属性.方法的可见性的关键字称之为访问修饰符. 1.public 一个类中,同一包中,子类中,不同包中 2.protected 一个类中,同一包中,子类中 3.default 一 ...
- android连接打印机
android连接 网络打印,主要使用socket连接设备,发送指令给设备. 首先要有设备的IP,端口号一般默认的是9100 //打印设备网络IP etIp.setText("192.16 ...
- 14 Fragment 碎片总结
Fragment 碎片 一, Fragment是什么? Android 3.0以后出现的 Api11 以上 Activity的组成部分 Fragment(小的Activity) Fragment可以显 ...
- GCD API 理解 (一)
资料先行 GCD 深入理解:第一部分 GCD 深入理解:第二部分 以上两篇文章是关于GCD讲的比较好的文章,翻译自raywenderlich,该网站有很多关于iOS 开发的优秀文章. 引子 iOS 开 ...
- 2.QT中使用资源文件,程序打包
1 程序中使用资源文件 A 一个QT空项目 B 右击项目,添加新文件 添加后的效果是 C 右击main.prc,选择"添加现有项",找到要使用的资源文件.最终的效果是: ...