• opencv_cvCreateImage


    OpenCV中IplImage图像格式与BYTE图像数据的转换

    IplImage* iplImage;

    BYTE* data;

    1 由IplImage*得到BYTE*图像数据:

    data = iplImage->imageDataOrigin; //未对齐的原始图像数据

    或者

    data = iplImage->imageData; //已对齐的图像数据

    2 由BYTE*得到IplImage*图像数据

    iplImage = cvCreateImageHeader(cvSize(width,height),depth,channels);

    cvSetData(iplImage,data,step);

    首先由cvCreateImageHeader()创建IplImage图像头,制定图像的尺寸,深度和通道数;然后由

    cvSetData()根据 BYTE*图像数据指针设置IplImage图像头的数据,其中step指定该IplImage图像

    每行占的字节数,对于1通道的 IPL_DEPTH_8U图像,step可以等于width。

    1)如果是全新创造一个Iplimage,则用IplImage* cvCreateImage( CvSize size, int depth, int

    channels ),它创建头并分配数据。

    注:当不再使用这个新图像时,要调用void cvReleaseImage( IplImage** image )将它的头和图像数

    据释放!

    2)如果已经有图像数据但是没有为图像头分配存储空间,则

    先调用IplImage* cvCreateImageHeader( CvSize size, int depth, int channels )创建图像头,再

    调用void cvSetData( CvArr* arr, void* data, int step )指定图像数据,可以理解为将这个新图

    像的数据指针指向了一个已存在的图像数据上,不存在图像数据存储空间的分配操作。

    注:当不再使用这个新图像时,仅仅要调用void cvReleaseImageHeader( IplImage** image )将它的图像

    头释放,不需要释放数据空间!

    3)如果既有图像数据也有图像头(用于IplImage为静态分配存储空间的情况),则先调用IplImage*

    cvInitImageHeader( CvSize size, int depth, int channels )更改图像头,再调用void

    cvSetData( CvArr* arr, void* data, int step )指定图像数据。

    注:因为这个新图像使用的是其它图像的数据和已有的图像头,所以不能使用cvReleaseImage将它的

    头和图像数据释放,也不能使用cvReleaseData将它的图像数据释放!

    4)如果复制已有的一个图像创建,则用IplImage* cvCloneImage( const IplImage* image ),它制作

    图像的完整拷贝包括头、ROI和数据。

    注:当不再使用这个新图像时,要调用void cvReleaseImage( IplImage** image )将它的头和图像数

    据释放

  • 相关阅读:
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (四) 自动化部署
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (三) 服务观测
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (二) 部署微服务程序
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (一) 部署 Nacos
    C++知识点
    libmkl 学习笔记
    基于tesseract-OCR进行中文识别
    poco编译与运行
    Linux下的I/O复用与epoll详解(转载)
    高并发网络编程之epoll详解(转载)
  • 原文地址:https://www.cnblogs.com/mataiyuan/p/7750305.html
Copyright © 2020-2023  润新知