在做一个车牌识别项目时想到的,但是把这代码拿给老师看了才知道这是比较简单的加密了(本来还以为想到什么好点子),所以拿出了和大家分享下。这只是利用了Opencv而已,你也可以用纯c++,java,C#来写,只不过我做车牌识别时恰巧用到了Opencv所以就直接用了。关于opencv的安装os里面有篇文章写得不错http://my.oschina.net/gujianhan/blog/162120,在我这代码里除了对像素的操作借助了opencv其他的还都是c++。所以没有下面评论说的头文件也不是问题。运行之后你会发现两张图片完全一样,但是信息就是隐藏在图片里了
#include<iostream>
#include"highgui.h"
#include<vector>
#include"cv.h"
#include<fstream>
using
namespace
std;
using
namespace
cv;
void
readInformation(IplImage * imgSrc);
void
roatedImage(IplImage *imgSrc){
CvScalar t1,t2;
IplImage *imgCopy=cvCreateImage(cvSize(imgSrc->height,imgSrc->width),
imgSrc->depth,imgSrc->nChannels);
for
(
int
i=0;i<imgSrc->height;i++)
for
(
int
j=0;j<imgSrc->width;j++){
t1=cvGet2D(imgSrc,i,j);
cvSet2D(imgCopy,j,i,t1);
}
cvSaveImage(
"D:\\Opencv\\testSave.jpg"
,imgCopy);
}
int
addInformation(IplImage *imgSrc){
CvScalar t1,t2;
IplImage *imgCopy=cvCreateImage(cvSize(imgSrc->width,imgSrc->height),
imgSrc->depth,imgSrc->nChannels);
string str=
""
;
cout<<
"请输入你想要加入的文本:"
<<endl;
getline(cin,str);
int
length=0;
for
(
int
i=0;i<imgSrc->height;i++)
for
(
int
j=0;j<imgSrc->width;j++){
if
(length<str.length()){
t1=cvGet2D(imgSrc,i,j);
t1.val[0]=str[length];
cvSet2D(imgCopy,i,j,t1);
length++;
}
else
{
t1=cvGet2D(imgSrc,i,j);
cvSet2D(imgCopy,i,j,t1);
}
}
Mat mat(imgCopy);
string path;
cout<<
"输入图片保存路径(请保存为png格式):"
<<endl;
cin>>path;
imwrite(path.c_str(),mat);
return
str.length();
}
void
readInformation(IplImage * imgSrc,
int
wordNumber){
int
length=0;
CvScalar t1,t2;
for
(
int
i=0;i<imgSrc->height;i++){
for
(
int
j=0;j<imgSrc->width;j++){
if
(length<wordNumber){
t1=cvGet2D(imgSrc,i,j);
char
ch=(
int
)t1.val[0];
cout<<ch;
length++;
}
if
(length>=wordNumber)
break
;
}
}
}
///*
//改进函数
//*/
string toBinary(
int
num){
string str=
""
;
do
{
int
remaider=num%2;
num=num/2;
str+=to_string(remaider);
}
while
(num);
string str2=
""
;
for
(
int
i=str.length()-1;i>=0;i--)
str2+=str[i];
int
addNum=7-str2.length();
string str3=
""
;
for
(
int
i=0;i<addNum;i++)
str3+=
"0"
;
str2=str3+str2+
"00"
;
return
str2;
}
char
toChar(string strNumber){
strNumber=strNumber.substr(0,7);
int
sum=0;
for
(
int
i=0;i<strNumber.length();i++)
sum+=(strNumber[i]-
'0'
)*
pow
(2,(strNumber.length()-i-1));
char
ch=sum;
return
ch;
}
int
addInformation3(IplImage *imgSrc){
CvScalar t0,t1,t2;
IplImage *imgCopy=cvCreateImage(cvSize(imgSrc->width,imgSrc->height),
imgSrc->depth,imgSrc->nChannels);
string str=
""
;
cout<<
"请输入你想要加入的文本用#结束:"
<<endl;
getline(cin,str);
vector<string> vestr_3;
for
(
int
i=0;i<str.length();i++)
{
string tmp=toBinary(str[i]);
string tmp1=tmp.substr(0,3);
string tmp2=tmp.substr(3,3);
string tmp3=tmp.substr(6,3);
vestr_3.push_back(tmp1);
vestr_3.push_back(tmp2);
vestr_3.push_back(tmp3);
}
int
length=0;
for
(
int
i=0;i<imgSrc->height;i++)
for
(
int
j=0;j<imgSrc->width;j++){
if
(length<vestr_3.size()*3)
{
t1=cvGet2D(imgSrc,i,j);
string tmp=vestr_3[length/3];
for
(
int
m=0;m<3;m++)
{
if
(tmp[m]==
'1'
)
t1.val[m]+=1;
if
(tmp[m]==
'0'
)
t1.val[m]-=1;
}
cvSet2D(imgCopy,i,j,t1);
length+=3;
}
else
{
t1=cvGet2D(imgSrc,i,j);
cvSet2D(imgCopy,i,j,t1);
}
}
Mat mat(imgCopy);
string path;
cout<<
"输入图片保存路径(请保存为png格式):"
;
cin>>path;
imwrite(path.c_str(),mat);
return
str.length();
}
void
readInformation3(IplImage * imgSrc,IplImage* imgCopy){
int
length=0;
CvScalar t1,t2;
int
count2=0;
string tmp2=
""
;
for
(
int
i=0;i<imgSrc->height;i++){
for
(
int
j=0;j<imgSrc->width;j++){
t1=cvGet2D(imgSrc,i,j);
t2=cvGet2D(imgCopy,i,j);
string tmp=
""
;
tmp+=to_string(t2.val[0]-t1.val[0]>0?1:0);
tmp+=to_string(t2.val[1]-t1.val[1]>0?1:0);
tmp+=to_string(t2.val[2]-t1.val[2]>0?1:0);
if
(count2<3){
tmp2+=tmp;
count2++;
}
if
(count2==3){
char
ch=toChar(tmp2);
if
(
'#'
==ch)
return
;
cout<<ch;
count2=0;
tmp2=
""
;
}
}
}
}
void
menu(){
int
choice;
cout<<
"****************************NUPT B12 NIIT Liyao**************************"
<<endl;
cout<<
"**********1:选择图片加入信息****2:读取图片里面的信息****3:退出**********"
<<endl;
string path;
string path2;
cin>>choice;
switch
(choice){
case
1:
{
cout<<
"输入原图片的路径:"
;
cin>>path;
getchar
();
IplImage *imgSrc=cvLoadImage(path.c_str(),-1);
addInformation3(imgSrc);
}
break
;
case
2:
{
cout<<
"输入原图片和改变后图片的路径:"
<<endl;
cout<<
"原图片路径:"
;
cin>>path;
cout<<
"改变后图片的路径:"
;
cin>>path2;
cout<<endl;
IplImage *imgSrc2=cvLoadImage(path.c_str(),-1);
IplImage *imgCopy=cvLoadImage(path2.c_str(),-1);
readInformation3(imgSrc2,imgCopy);
cout<<endl;
}
break
;
case
3:
exit
(1);
break
;
default
:
cout<<
"错误指令!"
<<endl;
}
}
int
main(){
do
{
menu();
}
while
(1);
}
|
下面分别是我使用的原图片和改变后的图片以及程序运行截图:
转载请注明出处http://www.cnblogs.com/BasilLee/p/3741200.html。