OpenCV图像数据字节对齐
图像数据是否做字节对齐,可能影响到逐像素的遍历操作。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图像数据字节对齐的更多相关文章
- 音视频入门-04-BMP图像四字节对齐的问题
* 音视频入门文章目录 * BMP 图像四字节对齐 表示 BMP 位图中像素的位元是以行为单位对齐存储的,每一行的大小都向上取整为4字节(32 位 DWORD)的倍数.如果图像的高度大于 1,多个经过 ...
- OpenCV中IplImage图像格式与BYTE图像数据的转换
最近在将Karlsruhe Institute of Technology的Andreas Geiger发表在ACCV2010上的Efficent Large-Scale Stereo Matchin ...
- <学习opencv>图像、视频和数据文件
/*=========================================================================*/ // openCV中的函数 /*====== ...
- opencv IplImage各参数详细介绍以及如何从一个JPEG图像数据指针转换得到IplImage
这篇文章里介绍得最清楚了.http://blog.chinaunix.net/uid-22682903-id-1771421.html 关于颜色空间 RGB颜色空间已经非常熟悉了.HSV颜色空间需要 ...
- Alignment And Compiler Error C2719 字节对齐和编译错误C2719
Compiler Error C2719 'parameter': formal parameter with __declspec(align('#')) won't be aligned The ...
- Bitmap RGB24 4字节对齐
Bitmap RGB24 4字节对齐 本文中说的图片都是无压缩的彩色Bitmap图片. 最近在一个项目中有一个场景是需要将RGB32或RGB24的Bitmap转换成为RGB565的Bitmap,在RG ...
- 3、opencv 图像显示功能
#include <iostream>#include <opencv2/opencv.hpp>using namespace cv;using namespace std;i ...
- <学习opencv>图像和大型阵列类型
OPenCV /*=========================================================================*/ // 图像和大型阵列类型 /* ...
- OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...
随机推荐
- 51nod 1514 美妙的序列 分治NTT + 容斥
Code: #include<bits/stdc++.h> #define ll long long #define mod 998244353 #define maxn 400000 # ...
- [CF959B]Mahmoud and Ehab and the message题解
超级大模拟 直接用map吧string对应到编号上来,然后在开个数组把每个编号对应到每个可以互相转化区块上来,预处理出区块的最小值,使用时直接取最小是即可 代码 #include <cstdio ...
- Python_003(字符串的神操作)
一.编码问题 1.编码:计算机最早是ACSII码,美国人创造的,包含了英文字母(大写字母,小写字母)数字,标点等特殊符号; :共有7位0和1组成,表示128个ACSII码,但是计算机对7这个数字不敏感 ...
- linux文件软链接操作
cd /etc/alternatives ll php* lrwxrwxrwx 1 root root 15 Oct 23 15:24 php -> /usr/bin/php7.3* lrwxr ...
- 【2019 Multi-University Training Contest 6】
01: 02:https://www.cnblogs.com/myx12345/p/11650764.html 03: 04: 05:https://www.cnblogs.com/myx12345/ ...
- LintCode之合并排序数组II
题目描述: 分析:题目的意思是把数组A和数组B合并到数组A中,且数组A有足够的空间容纳A和B的元素,合并后的数组依然是有序的. 我的代码: public class Solution { /* * @ ...
- Js获取屏幕宽度、高度
document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.docume ...
- Hive学习之路(三)Hive处理中文乱码
Hive注释中文乱码 创建表的时候,comment说明字段包含中文,表成功创建之后,中文说明显示乱码 create external table movie( userID int comment ' ...
- apache主要配置详解
1. # Deny access to the entirety of your server's filesystem. You must # explicitly permit access to ...
- 小程序的开发框架MINA及小程序的启动机制
MINA框架分三个部分 视图层(View):有很多页面,每个页面有wxml和wxss组成的,视图结构和展现样式 逻辑层(App Service):处理事物逻辑的地方以及数据交互的服务中心 系统层(Na ...