/*
功能:读入图像文件,做图像反转,然后显示图像在屏幕上
*/
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>
int main(int argc, char *argv[])
{
IplImage* img = 0;
int height,width,step,channels;
uchar *data;
int i,j,k;
if(argc<2)
{
printf("Usage: main <image-file-name>/n/7");
exit(0);
}
// 载入图像
img=cvLoadImage(argv[1],-1);
if(!img)
{
printf("Could not load image file: %s/n",argv[1]);
exit(0);
}
// 获取图像信息
height = img->height;
width = img->width;
step = img->widthStep;
channels = img->nChannels;
data = (uchar *)img->imageData;
printf("Processing a %dx%d image with %d channels/n",height,width,channels);
// 创建窗口
cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);
cvMoveWindow("mainWin", 100, 100);
// 反转图像
for(i=0;i<height;i++)
for(j=0;j<width;j++)
for(k=0;k<channels;k++)
data[i*step+j*channels+k]=255-data[i*step+j*channels+k];
// 显示图像
cvShowImage("mainWin", img );
cvWaitKey(0);
cvReleaseImage(&img );
printf("height=%d width=%d step=%d channels=%d",height,width,step,channels);
return 0;
}
//
//IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );
//filename
//要被读入的文件的文件名。
//flags
//指定读入图像的颜色和深度:
//指定的颜色可以将输入的图片转为3信道(CV_LOAD_IMAGE_COLOR)也即彩色(>0),
//单信道 (CV_LOAD_IMAGE_GRAYSCALE)也即灰色(=0), 或者保持不变(CV_LOAD_IMAGE_ANYCOLOR)(<0)。
//深度指定输入的图像是否转为每个颜色信道每象素8位,(OpenCV的早期版本一样),或者同输入的图像一样保持不变。
//选中CV_LOAD_IMAGE_ANYDEPTH,则输入图像格式可以为8位无符号,16位无符号,32位有符号或者32位浮点型。
//如果输入有冲突的标志,将采用较小的数字值。
//比如CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYCOLOR 将载入3信道图。
//CV_LOAD_IMAGE_ANYCOLOR和CV_LOAD_IMAGE_UNCHANGED是等值的。
//但是,CV_LOAD_IMAGE_ANYCOLOR有着可以和CV_LOAD_IMAGE_ANYDEPTH同时使用的优点,
//所以CV_LOAD_IMAGE_UNCHANGED不再使用了。
//如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR。
//函数cvLoadImage从指定文件读入图像,返回读入图像的指针。目前支持如下文件格式:
//Windows位图文件 - BMP, DIB;
//JPEG文件 - JPEG, JPG, JPE;
//便携式网络图片 - PNG;
//便携式图像格式 - PBM,PGM,PPM;
//Sun rasters - SR,RAS;
//TIFF文件 - TIFF,TIF;
//OpenEXR HDR 图片 - EXR;
//JPEG 2000 图片- jp2。
//=======================================================================================
//IplImage
//
//IPL 图像头
//typedef struct _IplImage
// {
// int nSize; /* IplImage大小,=sizeof(IplImage)*/
// int ID; /* 版本 (=0)*/
// int nChannels; /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */
// int alphaChannel; /* 被OpenCV忽略 */
// int depth; /* 像素的位深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
// IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F 可支持 */
// char colorModel[4]; /* 被OpenCV忽略 */
// char channelSeq[4]; /* 被OpenCV忽略 */
// int dataOrder; /* 0 - 交叉存取颜色通道,对三通道RGB图像,像素存储顺序为BGR BGR BGR ... BGR;
// 1 - 分开的颜色通道,对三通道RGB图像,像素存储顺序为RRR...R GGG...G BBB...B。
// cvCreateImage只能创建交叉存取图像 */
// int origin; /* 0 - 顶—左结构,
// 1 - 底—左结构 (Windows bitmaps 风格) */
// int align; /* 图像行排列 (4 or 8). OpenCV 忽略它,使用 widthStep 代替 */
// int width; /* 图像宽像素数 */
// int height; /* 图像高像素数*/
// struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */
// struct _IplImage *maskROI; /* 在 OpenCV中必须置NULL */
// void *imageId; /* 同上*/
// struct _IplTileInfo *tileInfo; /*同上*/
// int imageSize; /* 图像数据大小(在交叉存取格式下imageSize=image->height*image->widthStep),单位字节*/
// char *imageData; /* 指向排列的图像数据 */
// int widthStep; /* 排列的图像行大小,以字节为单位 */
// int BorderMode[4]; /* 边际结束模式, 被OpenCV忽略 */
// int BorderConst[4]; /* 同上 */
// char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */
// }
// IplImage;
//IplImage结构来自于 Intel Image Processing Library(是其本身所具有的)。OpenCV 只支持其中的一个子集:
//alphaChannel 在OpenCV中被忽略。
//colorModel 和channelSeq 被OpenCV忽略。
//OpenCV颜色转换的唯一函数 cvCvtColor把原图像的颜色空间的目标图像的颜色空间作为一个参数。
//dataOrder 必须是IPL_DATA_ORDER_PIXEL (颜色通道是交叉存取),
//然而平面图像的被选择通道可以被处理,就像COI(感兴趣的通道)被设置过一样。
//align 是被OpenCV忽略的,而用 widthStep 去访问后继的图像行。
//不支持maskROI 。处理MASK的函数把他当作一个分离的参数。
//MASK在 OpenCV 里是 8-bit,然而在 IPL他是 1-bit。
//tileInfo 不支持。
//BorderMode和BorderConst是不支持的。
//每个 OpenCV 函数处理像素的邻近的像素,
//通常使用单一的固定代码边际模式。
//除了上述限制,OpenCV处理ROI有不同的要求。
//要求原图像和目标图像的尺寸或 ROI的尺寸必须
//(根据不同的操作,例如cvPyrDown 目标图像的宽(高)必须等于原图像的宽(高)除以2 ±1)
//精确匹配,而IPL处理交叉区域,如图像的大小或ROI大小可能是完全独立的。
//======================================================================
//Processing a 512x512 image with 3 channels
//height=512 width=512 step=1536 channels=3请按任意键继续. . .
//从上述关系可以看出
//在C++内图像的存储是与Matlab不一样的
//是在C++内存储的方式是按照行列方式,每一行内存储了该列(所有层)的信息。
功能:读入图像文件,做图像反转,然后显示图像在屏幕上
*/
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>
int main(int argc, char *argv[])
{
IplImage* img = 0;
int height,width,step,channels;
uchar *data;
int i,j,k;
if(argc<2)
{
printf("Usage: main <image-file-name>/n/7");
exit(0);
}
// 载入图像
img=cvLoadImage(argv[1],-1);
if(!img)
{
printf("Could not load image file: %s/n",argv[1]);
exit(0);
}
// 获取图像信息
height = img->height;
width = img->width;
step = img->widthStep;
channels = img->nChannels;
data = (uchar *)img->imageData;
printf("Processing a %dx%d image with %d channels/n",height,width,channels);
// 创建窗口
cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);
cvMoveWindow("mainWin", 100, 100);
// 反转图像
for(i=0;i<height;i++)
for(j=0;j<width;j++)
for(k=0;k<channels;k++)
data[i*step+j*channels+k]=255-data[i*step+j*channels+k];
// 显示图像
cvShowImage("mainWin", img );
cvWaitKey(0);
cvReleaseImage(&img );
printf("height=%d width=%d step=%d channels=%d",height,width,step,channels);
return 0;
}
//
//IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );
//filename
//要被读入的文件的文件名。
//flags
//指定读入图像的颜色和深度:
//指定的颜色可以将输入的图片转为3信道(CV_LOAD_IMAGE_COLOR)也即彩色(>0),
//单信道 (CV_LOAD_IMAGE_GRAYSCALE)也即灰色(=0), 或者保持不变(CV_LOAD_IMAGE_ANYCOLOR)(<0)。
//深度指定输入的图像是否转为每个颜色信道每象素8位,(OpenCV的早期版本一样),或者同输入的图像一样保持不变。
//选中CV_LOAD_IMAGE_ANYDEPTH,则输入图像格式可以为8位无符号,16位无符号,32位有符号或者32位浮点型。
//如果输入有冲突的标志,将采用较小的数字值。
//比如CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYCOLOR 将载入3信道图。
//CV_LOAD_IMAGE_ANYCOLOR和CV_LOAD_IMAGE_UNCHANGED是等值的。
//但是,CV_LOAD_IMAGE_ANYCOLOR有着可以和CV_LOAD_IMAGE_ANYDEPTH同时使用的优点,
//所以CV_LOAD_IMAGE_UNCHANGED不再使用了。
//如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR。
//函数cvLoadImage从指定文件读入图像,返回读入图像的指针。目前支持如下文件格式:
//Windows位图文件 - BMP, DIB;
//JPEG文件 - JPEG, JPG, JPE;
//便携式网络图片 - PNG;
//便携式图像格式 - PBM,PGM,PPM;
//Sun rasters - SR,RAS;
//TIFF文件 - TIFF,TIF;
//OpenEXR HDR 图片 - EXR;
//JPEG 2000 图片- jp2。
//=======================================================================================
//IplImage
//
//IPL 图像头
//typedef struct _IplImage
// {
// int nSize; /* IplImage大小,=sizeof(IplImage)*/
// int ID; /* 版本 (=0)*/
// int nChannels; /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */
// int alphaChannel; /* 被OpenCV忽略 */
// int depth; /* 像素的位深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
// IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F 可支持 */
// char colorModel[4]; /* 被OpenCV忽略 */
// char channelSeq[4]; /* 被OpenCV忽略 */
// int dataOrder; /* 0 - 交叉存取颜色通道,对三通道RGB图像,像素存储顺序为BGR BGR BGR ... BGR;
// 1 - 分开的颜色通道,对三通道RGB图像,像素存储顺序为RRR...R GGG...G BBB...B。
// cvCreateImage只能创建交叉存取图像 */
// int origin; /* 0 - 顶—左结构,
// 1 - 底—左结构 (Windows bitmaps 风格) */
// int align; /* 图像行排列 (4 or 8). OpenCV 忽略它,使用 widthStep 代替 */
// int width; /* 图像宽像素数 */
// int height; /* 图像高像素数*/
// struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */
// struct _IplImage *maskROI; /* 在 OpenCV中必须置NULL */
// void *imageId; /* 同上*/
// struct _IplTileInfo *tileInfo; /*同上*/
// int imageSize; /* 图像数据大小(在交叉存取格式下imageSize=image->height*image->widthStep),单位字节*/
// char *imageData; /* 指向排列的图像数据 */
// int widthStep; /* 排列的图像行大小,以字节为单位 */
// int BorderMode[4]; /* 边际结束模式, 被OpenCV忽略 */
// int BorderConst[4]; /* 同上 */
// char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */
// }
// IplImage;
//IplImage结构来自于 Intel Image Processing Library(是其本身所具有的)。OpenCV 只支持其中的一个子集:
//alphaChannel 在OpenCV中被忽略。
//colorModel 和channelSeq 被OpenCV忽略。
//OpenCV颜色转换的唯一函数 cvCvtColor把原图像的颜色空间的目标图像的颜色空间作为一个参数。
//dataOrder 必须是IPL_DATA_ORDER_PIXEL (颜色通道是交叉存取),
//然而平面图像的被选择通道可以被处理,就像COI(感兴趣的通道)被设置过一样。
//align 是被OpenCV忽略的,而用 widthStep 去访问后继的图像行。
//不支持maskROI 。处理MASK的函数把他当作一个分离的参数。
//MASK在 OpenCV 里是 8-bit,然而在 IPL他是 1-bit。
//tileInfo 不支持。
//BorderMode和BorderConst是不支持的。
//每个 OpenCV 函数处理像素的邻近的像素,
//通常使用单一的固定代码边际模式。
//除了上述限制,OpenCV处理ROI有不同的要求。
//要求原图像和目标图像的尺寸或 ROI的尺寸必须
//(根据不同的操作,例如cvPyrDown 目标图像的宽(高)必须等于原图像的宽(高)除以2 ±1)
//精确匹配,而IPL处理交叉区域,如图像的大小或ROI大小可能是完全独立的。
//======================================================================
//Processing a 512x512 image with 3 channels
//height=512 width=512 step=1536 channels=3请按任意键继续. . .
//从上述关系可以看出
//在C++内图像的存储是与Matlab不一样的
//是在C++内存储的方式是按照行列方式,每一行内存储了该列(所有层)的信息。