- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题的根源是:OpenCV IplImage->imageData 属性的逐位格式是什么?
背景:我使用 Python 的 ctypes 允许 pythonic 访问使用 OpenCV 的低级 C 库。我已经能够获得几乎所有可从 python 访问的功能,但我仍然坚持这个要求旧 OpenCV 结构的数据(称为 IplImage)的功能,特别是 imageData 属性。我无法弄清楚 IplImage->imageData 是如何组织的,以及 python 的 cv2.cv.LoadImage 的 iplimage 类型是如何组织的,后者表面上与 C 结构具有相同的数据,但它的组织方式似乎不同。
例如,我有一个 4 像素的图像,即 2x2 像素。左上角像素为 100% 红色。右上角像素为 100% 绿色。左下像素为 100% 蓝色,右下像素为 100% 白色。
在 python 中,信息如下所示:
import cv2
img = cv2.cv.LoadImage('rgbw.png')
pixels = []
for ch in img.tostring():
pixels.append(ord(ch))
print pixels
[0, 0, 255, 0, 255, 0, 255, 0, 0, 255, 255, 255]
这对我来说很有意义:前三个值 [0, 0, 255] 代表 B:0, G:0, R:255,红色像素。第二个是绿色,第三个是左下角的蓝色,最后一个右下角是白色。
我将其编码到库中,它的库运行良好,但它似乎没有“看到”imageData 中的任何内容(我得到一个返回代码,意思是“我什么也没看到”,当我清楚地理解这个数据时直接使用 C api 将其传递到库中。
所以我当然怀疑 C IplImage->imageData 的数据组织方式完全不同,所以我查看调试器并惊讶地发现不仅数据不同,而且我无法理解它:here it是,从 cvLoadImage("rgbw.png") 开始,将其分配给名为“image”的 IplImage 结构。
Breakpoint 1, main (argc=2, argv=0x7fffffffe418) at IplImageInfo.cpp:44
44 printf("imageData %s\n", image->imageData);
(gdb) x/16ub image->imageData
0x618c90: 0 0 255 0 255 0 0 0
0x618c98: 255 0 0 255 255 255 0 0
(gdb)
因此逐字节比较,为了比较添加零:
python :
000 000 255 | 000 255 000 | 255 000 000 | 255 255 255
C:(打印前 16 个字节,而不是 12 个,这是我所期望的,见下文)
000 000 255 | 000 255 000 | 000 000 255 | 000 000 255 | 255 255 000 | 000
请注意前六个字节在两者中是相同的。但是,这是怎么回事?我们还有另外两个红色像素,然后……一个青色像素?另一件事,这个文件的大小是 12 个字节(4 个像素,每个像素 3 个字节)。当我从 C 打印出 image->imageSize 属性时,我得到的是 16,而不是 12。所以有些东西坏了,我不明白。显然我的 imageData 中的模型有问题。你能解释一下吗?
最佳答案
我使用的 python 代码缺少一些必需的逻辑。此逻辑不适用于 Python 接口(interface),并且在 Python 中没有关于它在 C 库中如何工作的线索。基本上,IplImage(我也相信 Mat;旧 IplImage 结构的 C++ 继承者)通过添加该数量的空(0 值)字节来填充 imageData 属性中的像素行,使其可以被 4 整除。所以我的代码是这样的:
import cv2
img = cv2.cv.LoadImage('rgbw.png')
pixels = []
for ch in img.tostring():
pixels.append(ord(ch))
print pixels
[0, 0, 255, 0, 255, 0, 255, 0, 0, 255, 255, 255]
缺少这个逻辑。我按以下方式解决了这个问题:
import cv2
img = cv2.cv.LoadImage('rgbw.png')
height = img.height
width = img.width
raw_data = img.tostring()
# iplImage->imageData requires rows to be padded with zero bytes at the end
# so they be divisible by 4
pad_bytes_per_row = width % 4
# create the ctypes structure
ubyte_array_type = c_ubyte * (len(raw_data) + (height * pad_bytes_per_row))
ubyte_array = ubyte_array_type()
index = 0
for ch in raw_data:
ubyte_array[index] = ord(ch)
index += 1
if 0 == index % width: # end of row
pad_index = 0
while pad_index < pad_bytes_per_row:
ubyte_array[index] = 0
pad_index += 1
index += 1
现在 ubyte_array 填充了来自 opencv 的 python API 的正确信息。请注意,如果您对数据使用 numpy_array.tostring() 方法并希望使用它来填充 Mat 对象,这将是相同的。希望这对某人有帮助。
关于python - 你如何将 Python cv2.cv.LoadImage 编码到 C IplImage->imageData 结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22585184/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!