OPENCV 图像翻转

环境:OPENCV2.4.6+VS2012

算法:

将摄入图像的左半边进行翻转,同时根据喜剧效果,将未翻转和翻转的图像合成到一副图像上


想法来源:

OPENCV 图像翻转_第1张图片

WIN32:

OPENCV 图像翻转_第2张图片

源图像

OPENCV 图像翻转_第3张图片

翻转图像

OPENCV 图像翻转_第4张图片

效果图

OPENCV 图像翻转_第5张图片

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

/*int main(){
	cv::Mat image=cv::imread("1.jpg");
	cv::namedWindow("My Image");
	cv::imshow("My image",image);
	cv::waitKey(5000);

	return 1;
}*/



//demo 2
//如果此处加了 using namespace cv,那么则下面不用cv::
#include <iostream>
using namespace std;
int main()
{


	///////////////////////////////////////////////////////////////////////////
	//demo1   图像翻转加权重相加
	/////////////////////////////////////////////////////////////////////////////
	
	//cv::Mat image;
	//std::cout<<"size,"<<image.size().height<<","
	//	<<image.size().width<<std::endl;
	//image= cv::imread("1.jpg");
	//if(!image.data)
	//{
	//	cout<<"image does not exist"<<endl;
	//}
	//cv::namedWindow("Original Image");//定义窗口
	//cv::imshow("Original Image",image);//显示图像
	//cv::Mat result;
	//cv::flip(image,result,1);//整理表示水平翻转,0表示垂直翻转,负数表示既有水平也有垂直翻转
	//cv::namedWindow("Output Image");
	//cv::imshow("Output Image", result);

	//cv::addWeighted(image,0.8,result,0.8,0,image);
	//cv::namedWindow("combine");
	//cv::imshow("combine", image);


	///////////////////////////////////////////////////////////////////////////////
	////demo2  暂时只有水平翻转,然后进行动态的合并,第一步先是静态合并
	//////////////////////////////////////////////////////////////////////////////
	
	float x,y;

	cv::Mat image;
	/*std::cout<<"size,"<<image.size().height<<","
		<<image.size().width<<std::endl;*/
	image= cv::imread("1.jpg");
	if(!image.data)
	{
		cout<<"image does not exist"<<endl;
	}
	cv::namedWindow("Original Image");//定义窗口
	cv::imshow("Original Image",image);//显示图像
	
	
	

	cv::Mat result;
	cv::flip(image,result,1);//整理表示水平翻转,0表示垂直翻转,负数表示既有水平也有垂直翻转
	cv::namedWindow("Output Image");
	cv::imshow("Output Image", result);

	/*cv::addWeighted(image,0.8,result,0.8,0,image);
	cv::namedWindow("combine");
	cv::imshow("combine", image);*/
	
	cout<<"请输入x的位置" "x的位置范围为0到"<<image.cols-1<<endl;
	cin>>x;
	////防止溢出
	/*if((x>=0)&&(x<=image.cols))
		x=x;
	else if(x<0)
		x=0;
	else  x=image.cols;*/

	//y=image.rows;
	
	// 我觉得这个地方的cvcreatemat函数用的不对,应该是创建一个mat,这里创建了cvmat
	//cv::Mat combine=cvCreateMat(3*image.cols,2*image.rows,3);
	//cv::Mat combine=cvCreateMat(2*image.cols,image.rows,CV_32FC1);

	//定义动态combine

	//cv::Mat combine = cv::Mat::zeros(image.rows,2*image.cols,image.type());
	cv::Mat combine = cv::Mat::zeros(image.rows,2*x,image.type());
	// define ROI
	cv::Mat imageROI1= combine(cv::Rect(0,0,x,image.rows));
	cv::Mat imageROI2= combine(cv::Rect(x,0,x,image.rows));
	
	//////DEBUG
	//std::cout<<combine.cols<<" "<<combine.rows<<endl; 
	
	//combine.copyTo(image(x,y,3))
	//cv::Mat combine(image,cv::Rect(0,0,x+1,y));
	//combine(cv::Rect(0,0,image.cols,image.rows)) = image;

	//原来的copy凡是
	//imageROI2=result;
	image(cv::Rect( 0, 0, x, image.rows)).copyTo(imageROI1);
	
	result(cv::Rect( image.cols-x, 0, x, image.rows)).copyTo(imageROI2);

	//////通过看到数值来验证是否是这个地方出错
	//std::cout<<combine(cv::Rect(0, 0, 3, 3))<<std::endl;
	cv::namedWindow("Combined Image");
	cv::imshow("Combined Image", combine);
	
	
	
	cv::waitKey(0);
	//cv::imwrite("2.jpg",result);
}



你可能感兴趣的:(opencv)