• 在OpenCV中实现matlab中的im2double功能


    最近在把matlab的代码转化到VS2010上。

    matlab中采用im2double将读入的图像转换为double型,在OpenCV中就需要对图像进行深度的转换。

    读入一幅灰度图像,深度为1(8U),在与其他矩阵M做运算事要保证深度是一致的,所以需要转换,如转换到深度为8(64F),需要用到OpenCV中的函数cvConvert。

    代码如下:
    IplImage* src = cvLoadImage("./Image/2/多波段.bmp",CV_LOAD_IMAGE_GRAYSCALE);   //载入灰度图像,深度为8U

    IplImage* dst= cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_64F, 1);

    cvConvert(src, dst);    //dst的数据部分在数值上与src的值一致,而其深度转换成了64F。

                                    //其实我是用的这个: cvConvertScale(src, dst, 1.0/255, 0);

    cvConvert函数用于图像和矩阵之间的相互转换

     为什么要用cvConvert 把IplImage转为矩阵?

          因为IplImage里的数据,只能用uchar的形式存放,当需要把这些图像数据看作数据矩阵来运算时,0~255的精度显然满足不了要求;

     然而CvMat里却可以存放任意通道数、任意格式的数据,这个机制方便了研究中的这种需求,转化为矩阵就可以进行更自由的计算。

    opencv的IplImage结构中有一个成员:depth。
    其取值如下:
    枚举值

    用%d输出 二进制

    IPL_DEPTH_8U : 8 : 0x0000 0008
    IPL_DEPTH_8S :

    -2147483640 : 0xffff fff8

    IPL_DEPTH_16U : 16 : 0x0000 0010
    IPL_DEPTH_16S : -2147483632 : 0xffff fff0
    IPL_DEPTH_32S : -2147483616 : 0xffff ffe0
    IPL_DEPTH_32F : 32 : 0x0000 0020
    IPL_DEPTH_64F : 64 : 0x0000 0040

    从文件或摄像头直接读取的图像一般都是8U的
    当有特殊计算需求时可以用cvScale() 或cvCvtScale() 转换。

    保存时必须转换回8U!

    不同的深度其取值范围不一样:
    0.0--1.0之间

    IPL_DEPTH_64F

    0.0--1.0之间

    IPL_DEPTH_32F

    0--65535之间

    IPL_DEPTH_32S

    -32768--32767之间

    IPL_DEPTH_16S

    0--65535之间

    IPL_DEPTH_16U

    -128--127之间

    IPL_DEPTH_8S

    0--255之间

    IPL_DEPTH_8U

    在用cvCreateMat函数时,参数:

    CV_8UC1 for Unsigned 8bits

    CV_32FC1 for float(32位)

    CV_64FC1 for double(64位) 

     

     

  • 相关阅读:
    CSS选择器实现搜索功能 驱动过滤搜索技术
    js实现倒计时 类似团购网站
    SQL Server系统表sysobjects介绍与使用
    四种开机的奇葩方法 设置定时开机
    sass 使用小记
    flex 弹性布局
    margin padding width height left top right bottom 百分比
    vue中canvas 实现手势密码
    babel-polyfill(解决浏览器不支持es6的问题)和es6-promise(解决不支持promise的问题)
    Ajax fetch axios的区别与优缺点
  • 原文地址:https://www.cnblogs.com/lxt287994374/p/3273413.html
Copyright © 2020-2023  润新知