【OpenCV学习】图像装载函数的模拟加载24BPP的BMP文件
2012-10-13 21:46
686 查看
作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/
作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/
出处:http://www.cnblogs.com/gnuhpc/
/* 文中出现的注释若为三项注释,则依次为: Offset Size Purpose */ #include <iostream> #include <cstdio> #include <cstdlib> #include <cv.h> #include <highgui.h> using namespace std; /*****[自己画图用的构造体]*****/ struct Image { unsigned long sizeX; unsigned long sizeY; char *data; }; typedef struct Image Image; /****[BMP图像导入]**************/ int ImageLoad(char *filename, Image *image) { FILE *file; unsigned long size; unsigned long i; unsigned short int planes; unsigned short int bpp; char temp; if ((file = fopen(filename, "rb"))==NULL)//读入文件 { printf("File Not Found : %s/n",filename); return 0; } fseek(file, 18, SEEK_CUR);//直接跳到宽度信息读取部分 /*读取宽度信息:18 4 the bitmap width in pixels (signed integer).*/ if ((i = (unsigned long)fread(&image->sizeX, 4, 1, file)) != 1) { printf("Error reading width from %s./n", filename); return 0; } /*读取高度信息:22 4 the bitmap height in pixels (signed integer).*/ if ((i = (unsigned long)fread(&image->sizeY, 4, 1, file)) != 1) { printf("Error reading height from %s./n", filename); return 0; } size = image->sizeX * image->sizeY * 3;//三通道 /*读取色彩平面个数(必须为1) 26 2 the number of color planes being used. Must be set to 1.*/ if ((fread(&planes, 2, 1, file)) != 1) { printf("Error reading planes from %s./n", filename); return 0; } if (planes != 1) { printf("Planes from %s is not 1: %u/n", filename, planes); return 0; } /*读取像素深度 28 2 the number of bits per pixel, which is the color depth of the image. Typical values are 1, 4, 8, 16, 24 and 32.*/ if ((i = (unsigned long)fread(&bpp, 2, 1, file)) != 1) { printf("Error reading bpp from %s./n", filename); return 0; } if (bpp != 24) { printf("Bpp from %s is not 24: %u/n", filename, bpp); return 0; } fseek(file, 24, SEEK_CUR); image->data = (char *) malloc(size); if (image->data == NULL) { printf("Error allocating memory for color-corrected image data"); return 0; } if ((i = (unsigned long)fread(image->data, size, 1, file)) != 1) { printf("Error reading image data from %s./n", filename); return 0; } for (i=0;i<size;i+=3) { temp = image->data[i]; image->data[i] = image->data[i+2]; image->data[i+2] = temp; }//RGB<->BGR return 1; } /*****[准备装载图像]******************/ IplImage *imgA; CvSize window_size; void LoadImage() { Image *image1; image1 = (Image *) malloc(sizeof(Image)); if (image1 == NULL) { printf("Error allocating space for image"); return ; } if (!ImageLoad("test2.bmp", image1)) { return ; } window_size.width = image1->sizeX; window_size.height= image1->sizeY; imgA = cvCreateImage(window_size,IPL_DEPTH_8U,3); imgA->imageData = image1->data; free(image1); cvCvtColor(imgA, imgA, CV_RGB2BGR); cvFlip(imgA,NULL,0); } int main( int argc, char **argv) { LoadImage(); cvNamedWindow("MY FUNCTION",CV_WINDOW_AUTOSIZE); cvShowImage("MY FUNCTION",imgA); /*OpenCV*/ IplImage *imgB = cvLoadImage( "test2.bmp", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if(imgB ==NULL) { cout<<"Can't Load Image ." << endl; exit(0); } cvNamedWindow("OpenCV FUNC",CV_WINDOW_AUTOSIZE); cvShowImage("OpenCV FUNC",imgB); cvWaitKey(0); free(imgA->imageData); cvReleaseImage( & imgA); cvReleaseImage( & imgB); cvDestroyAllWindows(); return 0; }
作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/
相关文章推荐
- OpenCV学习——图像装载函数的模拟加载24BPP的BMP文件
- opencv学习笔记-加载图像(释疑:非mat类与mat类、头文件引用)
- opencv2函数学习之blur,GaussianBlur,medianBlur和bilateralFilter:实现图像平滑处理
- OpenCv学习笔记(六)----图像空间缩减,OpenCv中的计时函数和OpenCv中操作图像单个像素点的方法
- 1.1.0-学习Opencv与MFC混合编程之---全屏截图,保存为BMP图像(并增加快捷键)
- 把DICOM文件中的图像部分提取到BMP文件的函数
- Opencv2.4.8 学习第一课 配置与加载图像
- OpenCV学习-常用的图像和矩阵操作函数
- opencv2.4.9学习_加载并显示一个图像
- 1.1.0-学习Opencv与MFC混合编程之---全屏截图,保存为BMP图像(并增加快捷键)
- <opencv学习 1>图像文件的读入与显示
- opencv2函数学习之erode、dilate:图像腐蚀和膨胀
- 1.1.0-学习Opencv与MFC混合编程之---全屏截图,保存为BMP图像(并增加快捷键)
- php Socket模拟表单上传文件函数_学习
- 图像编程学习笔记1——bmp文件结构处理与显示
- opencv 2.x学习笔记(一)加载和显示图像
- OpenCV学习第二篇:加载,修改和保存图像(复习)
- 【OpenCV学习笔记】之六 手写图像旋转函数---万丈高楼平地起
- opencv学习(7)图像的各种滤波函数的介绍
- opencv学习(二)之图像的加载、显示、保存