今天听说很多同志们写毕业论文重复率过高的问题,大牛说用图片代替字就行了,我就想用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由汉字生成图片(透明)----可以对抗论文查重!!!的更多相关文章

  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. Appium移动自动化测试(三)--安装Android模拟器(建议直接连手机,跳过此步)

    转自虫师,亲测有效,留备后用. 本文中如果直接安装时不出现错误,则可以忽略(一.二.三.四.五),我安装的是5.1.1,直接成功,就是有点慢,要有耐心. 如果到最后一步,启动不起来,报错: emula ...

  2. 在8X8的棋盘上分布着n个骑士,他们想约在某一个格中聚会。骑士每天可以像国际象棋中的马那样移动一次,可以从中间像8个方向移动(当然不能走出棋盘),请计算n个骑士的最早聚会地点和要走多少天。要求尽早聚会

    在8X8的棋盘上分布着n个骑士,他们想约在某一个格中聚会.骑士每天可以像国际象棋中的马那样移动一次,可以从中间像8个方向移动(当然不能走出棋盘),请计算n个骑士的最早聚会地点和要走多少天.要求尽早聚会 ...

  3. 如何使用Matlab产生对称矩阵

    有时候做实验需要使用对称矩阵,这里介绍如何使用Matlab产生随机的对称矩阵. 用例子说明一下:我要产生4X4的随机矩阵,要求是对称矩阵. 产生对称矩阵 A = rand(4); B = tril(A ...

  4. Struts 2之Servlet API

    Struts 2对Servlet API进行了封装,是业务层更加独立,如果需要调用Request.Response等Servlet API有两种途径 利用ServletActinContext的静态方 ...

  5. memcached实战系列(一)memcached安装

    下载并安装Memcached服务器端 我用的是cenos6.5 64位系统. libevent是个程序库,它将Linux的epoll.BSD类操作系统的kqueue等事件处理功能封装成统一的接口,具有 ...

  6. Android必知必会-使用okhttp的PUT方式上传文件

    注:如果移动端排版有问题,请看 简书版 (<-点击左边),希望CSDN能更好的支持移动端. 背景 公司的文件上传接口使用PUT协议,之前一直用的都是老项目中的上传类,现在项目中使用了okhttp ...

  7. 【一天一道LeetCode】#172. Factorial Trailing Zeroes

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  8. 【安卓中的缓存策略系列】安卓缓存策略之磁盘缓存DiskLruCache

    安卓中的缓存包括两种情况即内存缓存与磁盘缓存,其中内存缓存主要是使用LruCache这个类,其中内存缓存我在[安卓中的缓存策略系列]安卓缓存策略之内存缓存LruCache中已经进行过详细讲解,如看官还 ...

  9. javascript之event对象

    注意:以下给出的是在IE下的event事件说明,如果应用在非IE下可能会出现兼容性问题,需要结合具体的应用环境,使用兼容性的函数来处理 1.altKey 描述: 检查alt键的状态. 语法: even ...

  10. Arquillian Exception:java.lang.NoClassDefFoundError

    Issue: When you deploy and run Arquillian testcase, you may encountered java.lang.NoClassDefFoundErr ...