用Opencv实现简单的图片翻页

本文主要介绍用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;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bixiwen_liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值