先看一个简单的样例
代码:
// ConsoleApplication3_6_23.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<opencv2/opencv.hpp> #include<iostream> #include<vector> using namespace std; using namespace cv; int _tmain(int argc, _TCHAR* argv[]) { Mat src,dst,dst1,dst2; src = imread("test.png"); if(!src.data) return -1; namedWindow("原图",CV_WINDOW_AUTOSIZE); namedWindow("x--",CV_WINDOW_AUTOSIZE); namedWindow("y--",CV_WINDOW_AUTOSIZE); imshow("原图",src); int nr = src.rows; int nc = src.cols; /************************************************************************/ /* x方向 */ /************************************************************************/ dst = src.clone(); for (int i = 0;i < nr;++i) { for (int j = 0;j < nc;++j) { dst.at<Vec3b>(i,j) = src.at<Vec3b>(i,nc-j-1); } } imshow("x--",dst); /************************************************************************/ /* y方向 */ /************************************************************************/ src.copyTo(dst1); for (int i = 0;i < nr;++i) { for (int j = 0;j < nc;++j) { dst1.at<Vec3b>(i,j) = src.at<Vec3b>(nr-i-1,j); } } imshow("y--",dst1); waitKey(0); return 0; }
1、Mat的ptr和[]
void image_rever(Mat& src,Mat& dst) { int nr = src.rows; int nc = src.cols; int ch = src.channels(); for (int i = 0;i < nr;++i) { uchar* srcr = src.ptr<uchar>(i); uchar* dstr = dst.ptr<uchar>(i); for (int j = 0;j < nc;++j) { dstr[ch * j + 0] = srcr[ch * (nc - j - 1) + 0]; dstr[ch * j + 1] = srcr[ch * (nc - j - 1) + 1]; dstr[ch * j + 2] = srcr[ch * (nc - j - 1) + 2]; } } }
2、Mat的ptr和指针
void image_rever(Mat& src,Mat& dst) { int nr = src.rows; int nc = src.cols; int ch = src.channels(); for (int i = 0;i < nr;++i) { uchar* srcr = src.ptr<uchar>(i); uchar* dstr = dst.ptr<uchar>(i); for (int j = 0;j < nc;++j) { *(dstr + ch * j + 0) = *(srcr + (ch * (nc - j - 1) + 0)); *(dstr + ch * j + 1) = *(srcr + (ch * (nc - j - 1) + 1)); *(dstr + ch * j + 2) = *(srcr + (ch * (nc - j - 1) + 2)); } } }
3、Mat的迭代器iterator
void image_rever(Mat& src,Mat& dst) { typedef cv::Mat_<cv::Vec3b>::iterator matIterator; matIterator db = dst.begin<cv::Vec3b>(); matIterator de = dst.end<cv::Vec3b>(); matIterator se = src.end<cv::Vec3b>() - 1; for (; db != de; ++db,--se) { *db = *se; } }
void image_rever(Mat& src,Mat& dst) { typedef cv::Mat_<cv::Vec3b>::iterator matIterator; matIterator db = dst.begin<cv::Vec3b>(); matIterator de = dst.end<cv::Vec3b>(); matIterator se = src.end<cv::Vec3b>() - 1; for (; db != de; ++db,--se) { (*db)[0] = 255 - (*se)[0]; (*db)[1] = 255 - (*se)[1]; (*db)[2] = 255 - (*se)[2]; } }