程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 基於圖片的信息隱藏與顯示

基於圖片的信息隱藏與顯示

編輯:C++入門知識

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

  

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved