我尝试cv::bitwise_not到一个cv::Mat矩阵的双精度值。我是这样申请的
cv::bitwise_not(img, imgtemp);img是0和1的CV_64F数据,但是imgtemp里面有所有无意义的数据。我期望img中的0在imgtemp中为1,在img中的1在imgtemp中为0。如何将bitwise_not应用于双垫矩阵?谢谢
发布于 2013-07-23 16:23:48
我不能理解按位运算不是双精度(浮点)值:您还将在指数上执行按位运算(参见here)。所有位都将反转,从0到1,反之亦然。在function documentation中也有关于这方面的说明。
在浮点输入数组的情况下,其机器特定的位表示(通常符合IEEE754)用于操作。
如果像您建议的那样,希望0变为1,反之亦然,您可以这样做:
cv::threshold(warpmask, warpmaskTemp,0.5,1.0,THRESH_BINARY_INV)(参见documentation) (是的,您可以对输入和目标使用相同的矩阵)。
发布于 2013-07-23 15:27:01
我认为您要么得到了错误的方法签名,要么错误地命名了bitwise_not方法的参数。
根据OpenCV 2.4.6 Documentation on bitwise_not() method的说法
void bitwise_not(InputArray src, OutputArray dst, InputArray mask=noArray())如果你要使用任何掩码,它需要是最后一个参数,因为掩码对于'bitwise_not‘方法是一个可选的。
此外,为了避免混淆,所有数据类型都需要相同。我试图暗示的是,您的源和目标数据格式以及任何中间格式,如方法参数,都必须采用相同的格式。你不能有on ein CV_64F和其他在不同的地方。如果我没有在这里大错特错的话,为了简单起见,按位操作可能会要求所有数据都是无符号或有符号整数格式的。不过,所有类型都应该是相同的。
关于你得到的垃圾,我认为用一些合理的值初始化你的变量是一个通用的好的编程实践。这有助于您一步一步地进行调试,并确定失败的详细信息。
试试看。
发布于 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使得处理黑白逐位数据变得非常困难。
https://stackoverflow.com/questions/17803530
复制相似问题