OpenCV图像翻转
https://blog.****.net/Kelvin_Yan/article/details/49755313
矩阵(图像)镜像(翻转)
cv::flip
- void flip(InputArray src, OutputArray dst, int flipCode)
参数:
src,输入矩阵
dst,翻转后矩阵,类型与src一致
flipCode,翻转模式,flipCode==0垂直翻转(沿X轴翻转),flipCode>0水平翻转(沿Y轴翻转),flipCode<0水平垂直翻转(先沿X轴翻转,再沿Y轴翻转,等价于旋转180°)
实例:https://blog.****.net/wangzhebupt/article/details/18042823
环境: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);
- }