图像数据是否做字节对齐,可能影响到逐像素的遍历操作。OpenCV中的图像是HWC维度顺序存储,我们需要注意WC维度是否做4字节对齐。

这里使用的测试图如下:

注意它的宽度是471像素,是不能被4整除的。

1. IplImage的data字段,是char*类型,是4字节对齐。

const char* im_pth = "image.png";
IplImage* im = cvLoadImage(im_pth);

img->widthStep等于align_up(im->width*im->channels) //向上取整到最近的4的倍数

e.g.
width=471, channels=3, widthStep=1416

2. 手动创建的Mat通常是没有字节对齐的

e.g.

    FcImage fc_im = fc_load_image(im_pth);
    int im_h = fc_im.h;
    int im_w = fc_im.w;
    int im_c = fc_im.c;

    cv::Mat image = cv::Mat();
    image.create(im_h, im_w, CV_8UC3);
    cout << image.step << endl; //1413

来看看不对齐是什么效果,这里使用了fc image,提供的是对齐的图像数据,然后拷贝给手动创建的Mat,也就是不做对齐的:

    FcImage fc_im = fc_load_image(im_pth);
    int im_h = fc_im.h;
    int im_w = fc_im.w;
    int im_c = fc_im.c;

    cv::Mat image = cv::Mat();
    image.create(im_h, im_w, CV_8UC3);
    for (int h = 0; h < im_h; h++) {
        for (int w = 0; w < im_w; w++) {
            for (int c = 0; c < im_c; c++) {
                int src_idx = h * im_w*im_c + w * im_c + c;
                int dst_idx = h * im_w*im_c + w * im_c + c;
                image.data[dst_idx] = fc_im.data[src_idx];
            }
        }
    }
    std::cout << image.step << std::endl;

    cv::imshow("image", image);
    cv::waitKey(0);

3. 从IplImage转过来的Mat,是字节对齐的

早期的opencv2可以这样写:

const char* im_pth = "image.png";
IplImage* ipl = cvLoadImage(im_pth);
Mat mat(ipl); //或Mat mat(ipl, true)表示拷贝数据

后来的opencv不让这么写了,需要用cvarrayToMat函数:

    IplImage* ipl = cvLoadImage(im_pth);
    int im_h = ipl->height;
    int im_w = ipl->width;
    cv::Mat mat = cv::cvarrToMat(ipl);

    cv::imshow("image", mat);
    cv::waitKey(0);

4. 总结

如果需要逐像素操作,那么最好是定义并使用linebytes属性来替代每一处使用到的im_width*im_channel,因为linebytes=align_up(im_width*im_channel, 4)

OpenCV图像数据字节对齐的更多相关文章

  1. 音视频入门-04-BMP图像四字节对齐的问题

    * 音视频入门文章目录 * BMP 图像四字节对齐 表示 BMP 位图中像素的位元是以行为单位对齐存储的,每一行的大小都向上取整为4字节(32 位 DWORD)的倍数.如果图像的高度大于 1,多个经过 ...

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

    最近在将Karlsruhe Institute of Technology的Andreas Geiger发表在ACCV2010上的Efficent Large-Scale Stereo Matchin ...

  3. <学习opencv>图像、视频和数据文件

    /*=========================================================================*/ // openCV中的函数 /*====== ...

  4. opencv IplImage各参数详细介绍以及如何从一个JPEG图像数据指针转换得到IplImage

    这篇文章里介绍得最清楚了.http://blog.chinaunix.net/uid-22682903-id-1771421.html 关于颜色空间  RGB颜色空间已经非常熟悉了.HSV颜色空间需要 ...

  5. Alignment And Compiler Error C2719 字节对齐和编译错误C2719

    Compiler Error C2719 'parameter': formal parameter with __declspec(align('#')) won't be aligned The ...

  6. Bitmap RGB24 4字节对齐

    Bitmap RGB24 4字节对齐 本文中说的图片都是无压缩的彩色Bitmap图片. 最近在一个项目中有一个场景是需要将RGB32或RGB24的Bitmap转换成为RGB565的Bitmap,在RG ...

  7. 3、opencv 图像显示功能

    #include <iostream>#include <opencv2/opencv.hpp>using namespace cv;using namespace std;i ...

  8. <学习opencv>图像和大型阵列类型

    OPenCV /*=========================================================================*/ // 图像和大型阵列类型 /* ...

  9. OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...

随机推荐

  1. 如何分析及处理 Flink 反压?

    反压(backpressure)是实时计算应用开发中,特别是流式计算中,十分常见的问题.反压意味着数据管道中某个节点成为瓶颈,处理速率跟不上上游发送数据的速率,而需要对上游进行限速.由于实时计算应用通 ...

  2. 阿里云如何打破Oracle迁移上云的壁垒

    2018第九届中国数据库技术大会,阿里云数据库产品专家萧少聪带来以阿里云如何打破Oracle迁移上云的壁垒为题的演讲.Oracle是指“数据库管理系统”,面对Oracle迁移上云的壁垒,阿里云如何能够 ...

  3. php中间件是什么

    php中间件(middleware)是一个闭包,而且返回一个闭包. 中间件为过滤进入应用的HTTP请求提供了一套便利的机制,可以分为前置中间件和后置中间件.常用于验证用户是否经过认证,添加响应头(跨域 ...

  4. Reporting Services 配置工具

    使用 Reporting Services 配置管理器可配置 Reporting Services 安装.如果使用“仅文件”选项安装报表服务器,则必须使用此工具来配置服务器,才能使用该服务器.如果使用 ...

  5. vue双向数据绑定对于数组和新增对象属性不能监听的解决办法

    出现数组不能按照索引进行跟新的原因是处于性能考虑的,但是整体数组的增加删除是可以监听到的:对于对象新增属性不能监听是因为没有在生成vue实例时候放进watcher收集依赖. 首先我们先来了解vue数据 ...

  6. java文件转码

    完整项目带lib 参考 http://toyota2006.iteye.com/blog/540316 判断编码 package change; import info.monitorenter.cp ...

  7. 关于Spring中BeanUtils的一次使用问题记录

    1.问题描述:今天在进行前后端联调的时候,发现商品图片不能正常显示: 2.排查过程:查看浏览器控制台,发现调用接口返回的数据关于图片的字段未返回数据:      然后,又跑了一下Dao层的单元测试,从 ...

  8. onLayout初始化裁剪信息

    在EasyConstraintLayout中初始化LayoutParamsData的paths @Override protected void onLayout(boolean changed, i ...

  9. Hive学习之路(一)Hive初识

    Hive简介 什么是Hive Hive由Facebook实现并开源 是基于Hadoop的一个数据仓库工具 可以将结构化的数据映射为一张数据库表 提供HQL(Hive SQL)查询功能 底层数据是存储在 ...

  10. php面试专题---12、JavaScript和jQuery基础考点

    php面试专题---12.JavaScript和jQuery基础考点 一.总结 一句话总结: 比较常考察的是JavaScript的HTML样式操作以及jQuery的选择器和事件.样式操作. 1.下列不 ...