Flip
垂直,水平或即垂直又水平翻轉二維數組
void cvFlip( const CvArr* src, CvArr* dst=NULL, int flip_mode=0);
#define cvMirror cvFlip
src
原數組.
dst
目標責任制數組. 如果 dst = NULL 翻轉是在內部替換.
flip_mode
指定怎樣去翻轉數組。
flip_mode = 0 沿X-軸翻轉, flip_mode > 0 (如 1) 沿Y-軸翻轉, flip_mode < 0 (如 -1) 沿X-軸和Y-軸翻轉.見下面的公式
函式cvFlip 以三種方式之一翻轉數組 (行和列下標是以0為基點的):
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
函式主要使用在:
垂直翻轉圖像(flip_mode > 0)用於 頂-左和底-左圖像結構的轉換, 主要用於WIN32系統下的視頻操作處理.
水平圖像轉換,使用連續的水平轉換和絕對值差檢查垂直軸對稱(flip_mode > 0)
水平和垂直同時轉換,用於連續的水平轉換和絕對真理值差檢查中心對稱s(flip_mode < 0)
翻轉1維指針數組的順序(flip_mode > 0)
下面是關於這個函式的介紹以及簡單的測試小程式。
#include "stdafx.h"
#include "stdio.h"
#include "cv.h"
#include "highgui.h"
int main()
{
IplImage *pSrcImg = NULL;
IplImage *pClnImg = NULL;
pSrcImg = cvLoadImage("flower.jpg", 1);
if (pSrcImg == NULL)
{
printf("Fail to load images\n");
return -1;
}
pClnImg = cvCloneImage(pSrcImg);
if (pClnImg == NULL)
{
printf("Fail to clone the image\n");
return -1;
}
cvFlip(pClnImg, NULL,0); //核心在這裡 //不是cvFlip(src,pClnImg, 0);//pClinlmg必須先載入圖像,或者複製圖像!
cvNamedWindow("src", 0);
cvNamedWindow("turnover",0);
cvShowImage("src", pSrcImg);
cvShowImage("turnover", pClnImg);
cvWaitKey(0);
cvReleaseImage(&pSrcImg);
cvReleaseImage(&pClnImg);
cvDestroyWindow("src");
cvDestroyWindow("turnover");
return 0;
}
因為從AVI采出來的圖像有些是Windows點陣圖一樣是底左格式,即圖像像素開始與左下角,這樣圖像看起來是倒著的,需要進行垂直反轉。翻轉的判斷可以用IplImage::origin參數得知,origin為1即是翻轉圖。使用函式cvFlip進行翻轉。改出方法為:
在"//顯示圖像" 後面增加下面兩句
pFrImg->origin=1;
pBkImg->origin=1;