继续上篇 对于IplImage的操作


04.#include "stdafx.h"  
05.#include <stdlib.h>  
06.#include <stdio.h>  
07.#include <math.h>  
08.#include <cv.h>  
09.#include <highgui.h>  
10.int main(int argc, char *argv[])  
11.{  
12.    IplImage* img = 0;   
13.    int height,width,step,channels;  
14.    uchar *data;  
15.    int i,j,k;  
16.    if(argc<2)  
17.    {  
18.        printf("Usage: main <image-file-name>\n\7");  
19.        exit(0);  
20.    }  
21.    // 载入图像    
22.    img=cvLoadImage(argv[1],-1);  
23.    if(!img)  
24.    {  
25.        printf("Could not load image file: %s\n",argv[1]);  
26.        exit(0);  
27.    }  
28.    // 获取图像信息  
29.    height    = img->height;    
30.    width     = img->width;    
31.    step      = img->widthStep;    
32.    channels  = img->nChannels;  
33.    data      = (uchar *)img->imageData;  
34.    printf("Processing a %dx%d image with %d channels\n",height,width,channels);   
35.    // 创建窗口  
36.    cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);   
37.    cvMoveWindow("mainWin", 100, 100);  
38.    // 反转图像  
39.    for(i=0;i<height;i++)   
40.        for(j=0;j<width;j++)   
41.            for(k=0;k<channels;k++)  
42.                data[i*step+j*channels+k]=255-data[i*step+j*channels+k];  
43.    // 显示图像  
44.    cvShowImage("mainWin", img );  
45.    cvWaitKey(0);  
46.    cvReleaseImage(&img );  
47.    printf("height=%d  width=%d step=%d channels=%d",height,width,step,channels);  
48.    return 0;  
49.}  
50. 
51.//  
52.//IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );  
53.//filename   
54.//要被读入的文件的文件名。  
55.//flags   
56.//指定读入图像的颜色和深度:  
57.//指定的颜色可以将输入的图片转为3信道(CV_LOAD_IMAGE_COLOR)也即彩色(>0),   
58.//单信道 (CV_LOAD_IMAGE_GRAYSCALE)也即灰色(=0), 或者保持不变(CV_LOAD_IMAGE_ANYCOLOR)(<0)。  
59.//深度指定输入的图像是否转为每个颜色信道每象素8位,(OpenCV的早期版本一样),或者同输入的图像一样保持不变。  
60.//选中CV_LOAD_IMAGE_ANYDEPTH,则输入图像格式可以为8位无符号,16位无符号,32位有符号或者32位浮点型。  
61.//如果输入有冲突的标志,将采用较小的数字值。  
62.//比如CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYCOLOR 将载入3信道图。  
63.//CV_LOAD_IMAGE_ANYCOLOR和CV_LOAD_IMAGE_UNCHANGED是等值的。  
64.//但是,CV_LOAD_IMAGE_ANYCOLOR有着可以和CV_LOAD_IMAGE_ANYDEPTH同时使用的优点,  
65.//所以CV_LOAD_IMAGE_UNCHANGED不再使用了。  
66.//如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR。  
67.//函数cvLoadImage从指定文件读入图像,返回读入图像的指针。目前支持如下文件格式:  
68.//Windows位图文件 - BMP, DIB;  
69.//JPEG文件 - JPEG, JPG, JPE;  
70.//便携式网络图片 - PNG;  
71.//便携式图像格式 - PBM,PGM,PPM;  
72.//Sun rasters - SR,RAS;  
73.//TIFF文件 - TIFF,TIF;  
74.//OpenEXR HDR 图片 - EXR;  
75.//JPEG 2000 图片- jp2。  
76.//=======================================================================================  
77.//IplImage  
78.//  
79.//IPL 图像头  
80.//typedef struct _IplImage  
81.//    {  
82.//        int  nSize;           
83.//        int  ID;              
84.//        int  nChannels;       
85.//        int  alphaChannel;    
86.//        int  depth;           
88.//        char colorModel[4];   
89.//        char channelSeq[4];   
90.//        int  dataOrder;       
93.//        int  origin;          
95.//        int  align;           
96.//        int  width;           
97.//        int  height;          
98.//        struct _IplROI *roi;  
99.//        struct _IplImage *maskROI;   
100.//        void  *imageId;       
101.//        struct _IplTileInfo *tileInfo;   
102.//        int  imageSize;       
103.//        char *imageData;    
104.//        int  widthStep;     
105.//        int  BorderMode[4];   
106.//        int  BorderConst[4];   
107.//        char *imageDataOrigin;   
108.//    }  
109.//    IplImage;  
110.//IplImage结构来自于 Intel Image Processing Library(是其本身所具有的)。OpenCV 只支持其中的一个子集:  
111.//alphaChannel 在OpenCV中被忽略。  
112.//colorModel 和channelSeq 被OpenCV忽略。  
113.//OpenCV颜色转换的唯一函数 cvCvtColor把原图像的颜色空间的目标图像的颜色空间作为一个参数。  
114.//dataOrder 必须是IPL_DATA_ORDER_PIXEL (颜色通道是交叉存取),  
115.//然而平面图像的被选择通道可以被处理,就像COI(感兴趣的通道)被设置过一样。  
116.//align 是被OpenCV忽略的,而用 widthStep 去访问后继的图像行。  
117.//不支持maskROI 。处理MASK的函数把他当作一个分离的参数。  
118.//MASK在 OpenCV 里是 8-bit,然而在 IPL他是 1-bit。  
119.//tileInfo 不支持。  
120.//BorderMode和BorderConst是不支持的。  
121.//每个 OpenCV 函数处理像素的邻近的像素,  
122.//通常使用单一的固定代码边际模式。  
123.//除了上述限制,OpenCV处理ROI有不同的要求。  
124.//要求原图像和目标图像的尺寸或 ROI的尺寸必须  
125.//(根据不同的操作,例如cvPyrDown 目标图像的宽(高)必须等于原图像的宽(高)除以2 ±1)  
126.//精确匹配,而IPL处理交叉区域,如图像的大小或ROI大小可能是完全独立的。  
127.//======================================================================  
128.//Processing a 512x512 image with 3 channels  
129.//height=512  width=512 step=1536 channels=3请按任意键继续. . .  
130.//从上述关系可以看出  
131.//在C++内图像的存储是与Matlab不一样的  
132.//是在C++内存储的方式是按照行列方式,每一行内存储了该列(所有层)的信息。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/superdont/archive/2010/09/27/5910270.aspx

 

 

 

另外一种方法

    CvScalar s;
    for(int i=0;i<img->height;i++)...{
        for(int j=0;j<img->width;j++)...{
        s=cvGet2D(img,i,j); // get the (i,j) pixel value
        printf("B=%f, G=%f, R=%f ",s.val[0],s.val[1],s.val[2]);
        s.val[0]=111;
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值