环境:OPENCV2.4.6+VS2012
算法:
将摄入图像的左半边进行翻转,同时根据喜剧效果,将未翻转和翻转的图像合成到一副图像上
想法来源:
WIN32:
源图像
翻转图像
效果图
#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); }