基于图片的信息隐藏与显示

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

  

 

你可能感兴趣的:(图片)