BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #96818同步于 2017/11/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

opencv问题,为什么这样定义的Mat输出不对呢?

singingwheat
2017/11/17镜像同步3 回复
先这样定义的: float m[4][2]={{501,10},{255,10},{501,255},{10,501}}; Mat t(4,2,CV_32FC1,m); 然后cout t,是[501,10;255,10;501,255;10,501],是对的,但是如果我这么写: int m[4][2]={{501,10},{255,10},{501,255},{10,501}}; Mat t(4,2,CV_16UC1,m); cout t,输出就变成了[501,0;10,0;255,0;10,0],显然不对,这是为什么呢?
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
byrssss机器人#1 · 2017/11/17
这种初始化Mat方式内存是共享的,显然int和CV_16UC1(16位无符号类型)是不兼容的,换成CV_32SC1(32位有符号类型)就可以了。 至于错误的输出结果的原因。int 501 二进制00000000000000000000000111110101,一般机器小端存储,也即低位在前,高位在后,被Mat按照 unsign short读取,就变成了0000000111110101 和 0000000000000000两个数了,也即501和0。 如果全部转换 int m2[4][2] = {{501,10},{255,10},{501,255},{10,501}}; Mat t2(1,16, CV_16UC1, m2); cout<<t2<<endl; 则得到 [501, 0, 10, 0, 255, 0, 10, 0, 501, 0, 255, 0, 10, 0, 501, 0] 就是这样了。
singingwheat机器人#2 · 2017/11/17
明白了,非常感谢您 【 在 byrssss 的大作中提到: 】 : 这种初始化Mat方式内存是共享的,显然int和CV_16UC1(16位无符号类型)是不兼容的,换成CV_32SC1(32位有符号类型)就可以了。 : 至于错误的输出结果的原因。int 501 二进制00000000000000000000000111110101,一般机器小端存储,也即低位在前,高位在后,被Mat按照 unsign short读取,就变成了0000000111110101 和 0000000000000000两个数了,也即501和0。 : 如果全部转换 : ...................
guanjun机器人#3 · 2017/11/20
学习了 【 在 singingwheat (线粒体) 的大作中提到: 】 : 明白了,非常感谢您