前言:
目前兄弟们对“flip方法”大概比较关怀,看官们都需要了解一些“flip方法”的相关内容。那么小编同时在网上搜集了一些关于“flip方法””的相关知识,希望朋友们能喜欢,看官们一起来了解一下吧!opencv中的flip功能是实现图像水平、垂直及水平垂直翻转,应用方法为:
void cvFlip( const CvArr* src, CvArr* dst=NULL, int flip_mode=0)
其中:
src是原始图像数据
dst目标图像数据,如果dst为NULL,则在原始图像上操作
flip_mode指定怎样去翻转数组,flip_mode = 0 沿X-轴翻转, flip_mode > 0 (如 1)沿 Y-轴翻转,flip_mode < 0 (如 -1)沿X-轴和Y-轴翻转。
翻转公式如下
dst(i,j) = src(rows(src)-i-1,j) if flip_mode = 0
dst(i,j) = src(i,cols(src1)-j-1) if flip_mode > 0
dst(i,j) = src(rows(src)-i-1,cols(src)-j-1) if flip_mode < 0
翻转1维指针数组的顺序(flip_mode > 0)
功能模块具体实现流程如下:
#include <iostream>#include <opencv2/opencv.hpp>using namespace std;using namespace cv;void uflit(Mat& src, Mat& dst, int flipcode=-1){ int rows = src.rows, cols = src.cols, channels = src.channels(); src.convertTo(dst, src.type()); Mat uimg = dst; if(flipcode<=0) { for(int channel=0; channel<channels; ++channel) for(int row=0; row<rows; ++row) { for(int col=0; col<cols*channels/2; ) { auto tmp = uimg.data[row*cols*channels+col+channel]; uimg.data[row*cols*channels+col+channel] = uimg.data[row*cols*channels+(cols-1)*channels-col+channel]; uimg.data[row*cols*channels+(cols-1)*channels-col+channel] = tmp; col += 3; } } } if(flipcode!=0) { for(int channel=0; channel<channels; ++channel) for(int row=0; row<rows/2; ++row) { for(int col=0; col<cols*channels; ++col) { auto tmp = uimg.data[row*cols*channels+col+channel]; uimg.data[row*cols*channels+col+channel] = uimg.data[(rows-row-1)*cols*channels+col+channel]; uimg.data[(rows-row-1)*cols*channels+col+channel] = tmp; } } }}int main() { Mat img = imread("img.jpg"), uimg; uflip(img, uimg); return 0;}
可以看出基本功能已经能够实现。
标签: #flip方法