首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cv::Mat矩阵上的cv::bitwise_not

cv::Mat矩阵上的cv::bitwise_not
EN

Stack Overflow用户
提问于 2013-07-23 15:06:46
回答 3查看 5.1K关注 0票数 4

我尝试cv::bitwise_not到一个cv::Mat矩阵的双精度值。我是这样申请的

代码语言:javascript
复制
cv::bitwise_not(img, imgtemp);

img是0和1的CV_64F数据,但是imgtemp里面有所有无意义的数据。我期望img中的0在imgtemp中为1,在img中的1在imgtemp中为0。如何将bitwise_not应用于双垫矩阵?谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-23 16:23:48

我不能理解按位运算不是双精度(浮点)值:您还将在指数上执行按位运算(参见here)。所有都将反转,从0到1,反之亦然。在function documentation中也有关于这方面的说明。

在浮点输入数组的情况下,其机器特定的位表示(通常符合IEEE754)用于操作。

如果像您建议的那样,希望0变为1,反之亦然,您可以这样做:

代码语言:javascript
复制
cv::threshold(warpmask, warpmaskTemp,0.5,1.0,THRESH_BINARY_INV)

(参见documentation) (是的,您可以对输入和目标使用相同的矩阵)。

票数 4
EN

Stack Overflow用户

发布于 2013-07-23 15:27:01

我认为您要么得到了错误的方法签名,要么错误地命名了bitwise_not方法的参数。

根据OpenCV 2.4.6 Documentation on bitwise_not() method的说法

代码语言:javascript
复制
void bitwise_not(InputArray src, OutputArray dst, InputArray mask=noArray())

如果你要使用任何掩码,它需要是最后一个参数,因为掩码对于'bitwise_not‘方法是一个可选的。

此外,为了避免混淆,所有数据类型都需要相同。我试图暗示的是,您的源和目标数据格式以及任何中间格式,如方法参数,都必须采用相同的格式。你不能有on ein CV_64F和其他在不同的地方。如果我没有在这里大错特错的话,为了简单起见,按位操作可能会要求所有数据都是无符号或有符号整数格式的。不过,所有类型都应该是相同的。

关于你得到的垃圾,我认为用一些合理的值初始化你的变量是一个通用的好的编程实践。这有助于您一步一步地进行调试,并确定失败的详细信息。

试试看。

票数 0
EN

Stack Overflow用户

发布于 2019-07-16 09:39:01

按照Antonio的回答,你应该使用合适的工具来完成这项工作。double不是适用于布尔数据的存储介质。

在open cv中,您可以键入一个布尔值作为无符号字符(8位)。虽然在输入自己的真值时,你可以选择任何非零值,但在open cv中,0/255更自然;这样才能适应open cv的逐位运算和比较运算符。例如,可以采用任何类型的result = (input == 0)可以实现逐位not。Antonio答案中的阈值保持相同的类型(在某些情况下很有用)。对于bitwise_not,您应该首先将其设置为布尔格式。

不幸的是,opencv使得处理黑白逐位数据变得非常困难。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17803530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档