本文主要介绍用Opencv实现简单的图片翻页效果。下面是具体的代码实现。
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "vector"
using namespace cv;
using namespace std;
#define WINDOW_NAME "【翻书】"//namedWindow( "show", 1);//创建窗口
void showPicture_Left(Mat img_fan,Mat img_shu,Mat img)
{
int width = img_shu.cols;//读取图像宽度 ##
int height = img_shu.rows;//读取图像高度 ##
int channel = img_shu.channels();//读取图像通道数
int i, j,w,c = width/20,k = 0,k1=0;
int w1 = width/20;
for(w=width;w>=w1;w-=w1)
{
waitKey(100);
for(i=0;i<height;i++) //i为行数,即图像的高度
{
for(j=width-1;j>=w-20;j--) //j为的列数,即图像的宽度
{
for(c=0;c<3;c++) //c为通道数,RGB三个通道
{
int j2 = j + width;
img.at<Vec3b>(i,j2)[c] = img_shu.at<Vec3b>(i,j)[c];
}
}
}
k += w1*2;
k1 += w1;
Mat roi = img(Rect(2*width-k,0,k1,height));
Mat roi2 = img_fan(Rect(w-20,0,k1,height));
addWeighted(roi,0,roi2,1,0.,roi);
imshow( WINDOW_NAME,img);//显示图像
}
}
void showPicture_Right(Mat img_fan,Mat img_shu,Mat img)
{
int width = img_shu.cols;//读取图像宽度 ##
int height = img_shu.rows;//读取图像高度 ##
int channel = img_shu.channels();//读取图像通道数
int i, j,w,c;
for(w=width/20;w<=width;w+=width/20)
{
waitKey(100);
Mat ROI3 = img(Rect(0,0,w,height));
Mat ROI4 = img_shu(Rect(0,0,w,height));
addWeighted(ROI3,0,ROI4,1,0.,ROI3);
Mat roi = img(Rect(w,0,w,height));
Mat roi2 = img_fan(Rect(0,0,w,height));
addWeighted(roi,0,roi2,1,0.,roi);
imshow( WINDOW_NAME,img);//显示图像
}
}
int main()
{
vector<Mat> pic1(7);//定义一个Mat型的容器,存储容量为7
//将要翻页的图片存入容器中
pic1[0] = imread("1.jpg");
pic1[1] = imread("2.jpg");
pic1[2] = imread("3.jpg");
pic1[3] = imread("4.jpg");
pic1[4] = imread("5.jpg");
pic1[5] = imread("6.jpg");
pic1[6] = imread("7.jpg");
int num = pic1.size();//获取容器的容量
int i = -1;
Mat img_fengMian = pic1[0];
Mat img_fan = pic1[1];
Mat img_shu = pic1[2];
Mat img(img_shu.rows,img_shu.cols*2,CV_8UC3);//定义翻页窗口的大小,图片格式为8通道
Mat ROI3 = img(Rect(img.cols/2,0,img.cols/2,img.rows));
Mat ROI4 = img_fengMian(Rect(0,0,img_fengMian.cols,img_fengMian.rows));
addWeighted(ROI3,0,ROI4,1,0.,ROI3);
imshow(WINDOW_NAME,img);
cout << "开始翻页:输入l为向左翻页,输入r为向右翻页,输入y表示回封面,输入E退出。" << endl;
while(1)
{
int c = waitKey(0);
if ( (c & 255) == 27)
{
cout << "退出。。。。。" << endl;
break;
}
if ( i <= num )
{
if((char)c == 'l')
{
i += 2;
if ( i < num )
{
img_fan = pic1[i];
img_shu = pic1[i+1];
showPicture_Left(img_fan,img_shu,img);
}
if(i >= num)
{
cout << "已经是最底页了!不能向左翻页了,请向右翻页r 或回到封面y 或退出ESC!!!!!!" << endl;
if((char)waitKey(0) == 'r')
{
img_fan = pic1[i-3];
img_shu = pic1[i-4];
showPicture_Right(img_fan,img_shu,img);
i -= 4;
}
}
}
else if((char)c == 'r')
{
if (i > 1)
{
img_fan = pic1[i-1];
img_shu = pic1[i-2];
showPicture_Right(img_fan,img_shu,img);
i -= 2;
}
if ( i == 1 )
{
cout << "已经是最前页了!不能向右翻页了,请向左翻页l 或回到封面y 或退出ESC!!!" << endl;
}
}
else
waitKey(0);
}
}
waitKey(0);
return 0;
}