今天听说很多同志们写毕业论文重复率过高的问题,大牛说用图片代替字就行了,我就想用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. Android视频媒体相关,VideoView和开源框架vitamio

    虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,但是Vitamio的确强大到没朋友! Vitamio 是一款 An ...

  2. Servlet - Upload、Download、Async、动态注册

    Servlet 标签 : Java与Web Upload-上传 随着3.0版本的发布,文件上传终于成为Servlet规范的一项内置特性,不再依赖于像Commons FileUpload之类组件,因此在 ...

  3. OpenCV:Mat元素访问方法、性能、代码复杂度以及安全性分析

    欢迎转载,尊重原创,所以转载请注明出处: http://blog.csdn.net/bendanban/article/details/30527785 本文讲述了OpenCV中几种访问矩阵元素的方法 ...

  4. 生活沉思录 via 哲理小故事

    本文转载:http://www.cnblogs.com/willick/p/3174803.html 1.小托蒂的悲剧 意大利小男孩托蒂,有一只十分奇怪的眼睛,因为从生理上看,这是一只完全正常的眼睛, ...

  5. Effective C++ ——实现

    条款26:尽可能延后变量定义式的出现时间 当你定义一个变量的时候就要保证这个变量能够在程序中使用到,不要定义无意义的变量,这样就要求我们最好是在变量使用到的时候才做定义,因为如果一个变量定义了却不使用 ...

  6. #VSTS日志# Xamarin构建支持和一大波更新

    距离上次更新#VSTS日志#已经有将近3个月的时间了,赶上最近Xamarin开源免费的消息,VSTS也推出了更多跨平台的支持和许多其他功能.这里列出一些小编觉得比较重要. 1. Xamarin 构建模 ...

  7. iOS 10 推送全解析,注意事项

    本文旨在对 iOS 推送进行一个完整的剖析,如果你之前对推送一无所知,那么在你认真地阅读了全文后必将变成一个推送老手,你将会对其中的各种细节和原理有充分的理解.以下是 pikacode 使用 iOS ...

  8. 插件开发之360 DroidPlugin源码分析(五)Service预注册占坑

    请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52264977 在了解系统的activity,service,broa ...

  9. Java中导出到Excel实现_aspose.cells

    参考http://183615215-qq-com.iteye.com/blog/1858208 包下载:http://pan.baidu.com/s/1o6ju0ZK,将lib的jar包导入到工程中 ...

  10. Android View框架总结(一)

    View和Activity的区别 View有哪些? ViewGroup是什么? 为什么Google产生ViewGroup? View的层级结构是什么? View的onMeasure()/onLayou ...