【OpenCV学习】图像装载函数的模拟加载24BPP的BMP文件

简介: 作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ /* 文中出现的注释若为三项注释,则依次为: Offset Size Purpose */ #include #include #include #inclu...

作者: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/


               作者:gnuhpc
               出处:http://www.cnblogs.com/gnuhpc/
               除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


分享到:

目录
相关文章
|
2月前
|
算法 计算机视觉
Opencv学习笔记(六):cv2.resize函数的介绍
这篇文章介绍了OpenCV库中cv2.resize函数的使用方法,包括其参数、插值方式选择以及实际代码示例。
350 1
Opencv学习笔记(六):cv2.resize函数的介绍
|
2月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
477 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
3月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
52 4
|
3月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
4月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
4月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
120 1
|
6月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
206 1
|
6月前
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
83 1
|
6月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
102 0
|
5月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。