今天在实时处理图像采集卡采集的图像时,发现直接将图像采集卡采集的图像cvShowImage出来的是反着的图像,也就是图像采集卡采集的图像是以左下角为原点的,而窗口显示的图像原点是左上角,相当于是关于X轴翻转了。在显示图像之前使用cvFlip()函数将图像翻转一下就可以了。下面是关于这个函数的介绍以及简单的测试小程序。
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); //核心在这里
cvNamedWindow("src", 0);
cvNamedWindow("turnover",0);
cvShowImage("src", pSrcImg);
cvShowImage("turnover", pClnImg);
cvWaitKey(0);
cvReleaseImage(&pSrcImg);
cvReleaseImage(&pClnImg);
cvDestroyWindow("src");
cvDestroyWindow("turnover");
return 0;
}