在做一個車牌識別項目時想到的,但是把這代碼拿給老師看了才知道這是比較簡單的加密了(本來還以為想到什麼好點子),所以拿出了和大家分享下。這只是利用了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。