在做一个车牌识别项目时想到的,但是把这代码拿给老师看了才知道这是比较简单的加密了(本来还以为想到什么好点子),所以拿出了和大家分享下。这只是利用了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。