今天听说很多同志们写毕业论文重复率过高的问题,大牛说用图片代替字就行了,我就想用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.生成了透明的文字图片,粘贴到论文里面,估计查询重复的系统再牛逼也是无能为力了。后序有空做一些程序界面跟字符分割的东西,可以直接卖钱了。

当然,字体跟大小,上下边距都是可以设置的,后序再往程序里面写。

实现效果:

主要代码:

  1. // AddChinese.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. #include <opencv2/core/core.hpp>
  7. #include <opencv2/highgui/highgui.hpp>
  8. #include "CvxText.h"
  9.  
  10. #pragma comment(lib,"freetype255d.lib")
  11. #pragma comment(lib,"opencv_core2410d.lib")
  12. #pragma comment(lib,"opencv_highgui2410d.lib")
  13. #pragma comment(lib,"opencv_imgproc2410d.lib")
  14.  
  15. using namespace std;
  16. using namespace cv;
  17.  
  18. #define ROW_BLOCK 2
  19. #define COLUMN_Block 2
  20.  
  21. // writePng.cpp : 定义控制台应用程序的入口点。
  22. //
  23.  
  24. int run_test_png(Mat &mat,string image_name)
  25. {
  26.  
  27. /*采用自己设置的参数来保存图片*/
  28. //Mat mat(480, 640, CV_8UC4);
  29. //createAlphaMat(mat);
  30. vector<int> compression_params;
  31. compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
  32. compression_params.push_back(9); //png格式下,默认的参数为3.
  33. try
  34. {
  35. imwrite(image_name, mat, compression_params);
  36. }
  37. catch (runtime_error& ex)
  38. {
  39. fprintf(stderr, "Exception converting image to PNG format: %s\n", ex.what());
  40. return 1;
  41. }
  42. fprintf(stdout, "Saved PNG file with alpha data.\n");
  43.  
  44. waitKey(0);
  45. return 0;
  46. }
  47.  
  48. int coloured(Mat &template_src, Mat &mat_png, CvScalar color)
  49. {
  50.  
  51. for (int i = 0; i < template_src.rows; ++i)
  52. {
  53. for (int j = 0; j < template_src.cols; ++j)
  54. {
  55. Vec4b& bgra = mat_png.at<Vec4b>(i, j);
  56. //int temp = template_src.at<uchar>(i,j);
  57. if (template_src.at<uchar>(i,j)== 0)
  58. {
  59. bgra[0] = color.val[0]; //b通道
  60. bgra[1] = color.val[1]; //g通道
  61. bgra[2] = color.val[2]; //r通道
  62. bgra[3] = 255;//alpha通道全部设置为透明完全透明为0,否则为255
  63. }
  64. else
  65. {
  66. bgra[3] = 0;//alpha通道全部设置为透明完全透明为0,否则为255
  67. }
  68.  
  69. }
  70. }
  71.  
  72. return 0;
  73. }
  74.  
  75. void ImageBinarization(IplImage *src)
  76. { /*对灰度图像二值化,自适应门限threshold*/
  77. int i,j,width,height,step,chanel,threshold;
  78. /*size是图像尺寸,svg是灰度直方图均值,va是方差*/
  79. float size,avg,va,maxVa,p,a,s;
  80. unsigned char *dataSrc;
  81. float histogram[256];
  82.  
  83. width = src->width;
  84. height = src->height;
  85. dataSrc = (unsigned char *)src->imageData;
  86. step = src->widthStep/sizeof(char);
  87. chanel = src->nChannels;
  88. /*计算直方图并归一化histogram*/
  89. for(i=0; i<256; i++)
  90. histogram[i] = 0;
  91. for(i=0; i<height; i++)
  92. for(j=0; j<width*chanel; j++)
  93. {
  94. histogram[dataSrc[i*step+j]-'0'+48]++;
  95. }
  96. size = width * height;
  97. for(i=0; i<256; i++)
  98. histogram[i] /=size;
  99. /*计算灰度直方图中值和方差*/
  100. avg = 0;
  101. for(i=0; i<256; i++)
  102. avg += i*histogram[i];
  103. va = 0;
  104. for(i=0; i<256; i++)
  105. va += fabs(i*i*histogram[i]-avg*avg);
  106. /*利用加权最大方差求门限*/
  107. threshold = 20;
  108. maxVa = 0;
  109. p = a = s = 0;
  110. for(i=0; i<256; i++)
  111. {
  112. p += histogram[i];
  113. a += i*histogram[i];
  114. s = (avg*p-a)*(avg*p-a)/p/(1-p);
  115. if(s > maxVa)
  116. {
  117. threshold = i;
  118. maxVa = s;
  119. }
  120. }
  121. /*二值化*/
  122. for(i=0; i<height; i++)
  123. for(j=0; j<width*chanel; j++)
  124. {
  125. if(dataSrc[i*step+j] > threshold)
  126. dataSrc[i*step+j] = 255;
  127. else
  128. dataSrc[i*step+j] = 0;
  129. }
  130. }
  131.  
  132. Mat binaryzation(Mat &src)
  133. {
  134. Mat des_gray(src.size(),CV_8UC1);
  135.  
  136. cvtColor(src,des_gray,CV_BGR2GRAY);
  137.  
  138. //Mat bin_mat();
  139. IplImage temp(des_gray);
  140. ImageBinarization(&temp);
  141.  
  142. //threshold(des_gray,des_gray,150,255,THRESH_BINARY);
  143. imshow("二值图像",des_gray);
  144. return des_gray;
  145. }
  146.  
  147. int generate_chinese(const int size_zi, const char *msg ,int number,CvScalar color)
  148. {
  149. //int size_zi = 50;//字体大小
  150. CvSize czSize; //目标图像尺寸
  151. float p = 0.5;
  152. CvScalar fsize;
  153.  
  154. //读取TTF字体文件
  155. CvxText text("simhei.ttf");
  156.  
  157. //设置字体属性 字体大小/空白比例/间隔比例/旋转角度
  158. fsize = cvScalar(size_zi, 1, 0.1, 0);
  159. text.setFont(NULL, &fsize, NULL, &p);
  160.  
  161. czSize.width = size_zi*number;
  162. czSize.height = size_zi;
  163. //加载原图像
  164. IplImage* ImageSrc = cvCreateImage(czSize,IPL_DEPTH_8U,3);//cvLoadImage(Imagename, CV_LOAD_IMAGE_UNCHANGED);
  165. //Mat image(ImageSrc);
  166. //createAlphaMat(image);
  167. //ImageSrc = ℑ
  168.  
  169. //IplImage temp(image);
  170. //ImageSrc = &temp;
  171.  
  172. //设置原图像文字
  173. text.putText(ImageSrc, msg, cvPoint(1, size_zi), color);
  174.  
  175. //显示原图像
  176. cvShowImage("原图", ImageSrc);
  177.  
  178. string hanzi = msg;
  179. hanzi = hanzi + ".png";
  180.  
  181. Mat chinese(ImageSrc,true);
  182. Mat gray = binaryzation(chinese);
  183.  
  184. imwrite("chinese_gray.jpg",gray);
  185.  
  186. Mat mat_png(chinese.size(),CV_8UC4);
  187. coloured(gray,mat_png,color);
  188. run_test_png(mat_png,hanzi);
  189. //
  190. ////cvSaveImage("hanzi.jpg",reDstImage);
  191. //run_test_png(chinese,hanzi);
  192. //等待按键事件
  193. cvWaitKey();
  194. return 0;
  195. }
  196.  
  197. int main()
  198. {
  199. CvScalar color = CV_RGB(0,0,0);
  200. int size = 200;
  201. const char* msg = "你好a";//暂时一行字不要太长
  202.  
  203. int number = 3;//字符个数
  204.  
  205. generate_chinese(size,msg,number,color);
  206.  
  207. return 0;
  208. }

完整工程下载:

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由汉字生成图片(透明)----可以对抗论文查重!!!的更多相关文章

  1. 论文 查重 知网 万方 paperpass

    相信各个即将毕业的学生或在岗需要评职称.发论文的职场人士,论文检测都是必不可少的一道程序.面对市场上五花八门的检测软件,到底该如何选择?选择查重后到底该如何修改?现在就做一个知识的普及.其中对于中国的 ...

  2. PaperBye-一个可以自动改重的免费论文查重网站

    推荐一个自动降重的免费论文查重软件,可自动降低论文重复率,一边修改,一边查重,免费查重网址:https://www.paperbye.com

  3. python简单实现论文查重(软工第一次项目作业)

    前言 软件工程 https://edu.cnblogs.com/campus/gdgy/informationsecurity1812 作业要求 https://edu.cnblogs.com/cam ...

  4. l论文查重平台

    推荐大家一个靠谱的论文检测平台.重复的部分有详细出处以及具体修改意见,能直接在文章上做修改,全部改完一键下载就搞定了.怕麻烦的话,还能用它自带的降重功能.哦对了,他们现在正在做毕业季活动, 赠送很多免 ...

  5. python 将windows字体中的汉字生成图片的方法

    #encoding: utf-8import osimport pygame chinese_dir = '黑体常规'if not os.path.exists(chinese_dir): os.mk ...

  6. Opencv读取各种格式图片,在TBitmap上面重绘

    //opencv读取图片 cv::Mat image; //const char *fileName = "HeadImage-UI/Photo-001.bmp"; const c ...

  7. 代码之间-论文修改助手v1.0版本发布

    论文查重,是每个毕业生都要面临的一个令人头疼的问题,如果写论文不认真,很可能导致查重红一大片. 之前有帮助一些朋友修改论文降低重复率,做了一些工作后发现,国内的查重机构,如知网.维普等,大多数是基于关 ...

  8. 【HanLP】资料链接汇总

    Java中调用HanLP配置 HanLP自然语言处理包开源官方文档 了解HanLP的全部 自然语言处理HanLP 开源自由的汉语言处理包主页 GitHub源码 基于hanLP的中文分词详解-MapRe ...

  9. 高校手机签到系统——第一部分Authority权限系统(下)

    很抱歉,之前寝室光纤断了,所以到现在才更新这个系列的第二篇博客.点击访问高校手机签到系统——第一部分Authority权限系统(上) 这几天我反思了一下上一篇写博上的方式,一味的贴代码式的,是否应该更 ...

随机推荐

  1. java.io.FileNotFoundException: D:\Program%20Files\Apache%20Software%20Foundation\Tomcat%205.0\webapp

    慢慢把以前遇到过的问题一点点发出来,以前做的笔记比较杂: java.io.FileNotFoundException: D:\Program%20Files\Apache%20Software%20F ...

  2. (译)Objective-C 类属性

    翻译自:Objective-C Class Properties 译者:Haley_Wong 由于Swift 3.0 出了太多令人兴奋的新特性,人们很容易忽略 Objective-C中的小改动.苹果展 ...

  3. Android 结合实际项目学会ListView局部刷新和相关知识《一》

    转载本专栏博客,请注明出处:道龙的博客 最近在公司参与的项目中有一个界面需要做局部UI更新处理,把其化烦为简为Demoi形式写在这里.我们还是运行该Demo,知道ListView局部刷新的使用场景:( ...

  4. Swift基础之UIPickerView和小animate的使用

    写一个简单的UIPickerView的使用Demo,比较简单,其中和一个小动画的结合使用 UIPickerView的使用基本上跟OC语言中的一样,就是写法的样式问题,想必开发过OC的应该不需要多讲了, ...

  5. 快速了解 Robot Operating System(ROS) 机器人操作系统

     http://www.ros.org/ 关于ROS About ROS http://www.ros.org/about-ros/ 机器人操作系统(ROS)是用于编写机器人软件的灵活框架.目的在简化 ...

  6. JAVA面向对象-----访问修饰符

    访问修饰符是用来控制类.属性.方法的可见性的关键字称之为访问修饰符. 1.public 一个类中,同一包中,子类中,不同包中 2.protected 一个类中,同一包中,子类中 3.default 一 ...

  7. android连接打印机

    android连接  网络打印,主要使用socket连接设备,发送指令给设备. 首先要有设备的IP,端口号一般默认的是9100 //打印设备网络IP etIp.setText("192.16 ...

  8. 14 Fragment 碎片总结

    Fragment 碎片 一, Fragment是什么? Android 3.0以后出现的 Api11 以上 Activity的组成部分 Fragment(小的Activity) Fragment可以显 ...

  9. GCD API 理解 (一)

    资料先行 GCD 深入理解:第一部分 GCD 深入理解:第二部分 以上两篇文章是关于GCD讲的比较好的文章,翻译自raywenderlich,该网站有很多关于iOS 开发的优秀文章. 引子 iOS 开 ...

  10. 2.QT中使用资源文件,程序打包

     1 程序中使用资源文件 A  一个QT空项目 B  右击项目,添加新文件 添加后的效果是 C  右击main.prc,选择"添加现有项",找到要使用的资源文件.最终的效果是: ...