我尝试将cv :: bitwise_not转换为double值的cv :: Mat矩阵。我申请了
cv::bitwise_not(img, imgtemp);
img
是CV_64F
0和1的数据。但imgtemp
内部包含所有无意义数据。
我希望img
中的0在imgtemp
处为1,在img
中为1,在imgtemp
处为0。如何将bitwise_not应用于双Mat矩阵?
感谢
答案 0 :(得分:3)
我无法理解按位而不是双(浮点)值:你将对指数进行按位运算(参见here)。所有位将被反转,从0到1,反之亦然。 function documentation中还有关于此方面的说明。
对于浮点输入数组,其机器特定位 表示(通常符合IEEE754标准)用于操作。
如果您希望零成为一个而反之,正如您建议的那样,您可以这样做:
cv::threshold(warpmask, warpmaskTemp,0.5,1.0,THRESH_BINARY_INV)
(参见documentation)(是的,你可以使用相同的矩阵作为输入和目的地)。
答案 1 :(得分:0)
我认为你要么让方法签名错误,要么错误地命名bitwise_not
方法的参数。
根据[OpenCV 2.4.6关于bitwise_not()方法的文档](http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#void bitwise_not(InputArray src,OutputArray dst,InputArray mask))
void bitwise_not(InputArray src, OutputArray dst, InputArray mask=noArray())
如果要使用任何掩码,则需要将其作为最后一个参数,因为mask对于'bitwise_not'方法是可选的。
此外,所有数据类型都必须相同才能避免混淆。我想要暗示的是,您的源和目标数据格式以及任何临时的数据格式(例如方法参数)必须采用相同的格式。你不能拥有ein CV_64F和其他不同的人。如果我没有在这里丢失我的弹珠,为了简单起见,按位操作可能需要你以无符号或有符号整数格式包含所有数据。不过,你应该拥有相同的所有类型。
关于你得到的垃圾,我认为你用一些合理的价值来初始化你的变量是一种通用且良好的编程习惯。当您逐步调试并确定失败的详细信息时,这会有所帮助。
试一试。
答案 2 :(得分:0)
要继续执行Antonio的回答,您应该使用正确的工具来完成工作。 double不是布尔数据的合适存储介质。
在开放式简历中,您可以输入布尔值作为无符号字符(8位)。尽管在键入自己的真实值时可以选择任何非零值,但在开放式简历中,0/255更自然;这种方式适合开放式简历的按位运算和比较运算符。例如。 result = (input == 0)
可以采用任何类型,这是无法实现的。 Antonio答案中的阈值保持相同的类型(在某些情况下有用)。对于bitwise_not,您应该首先将其设置为布尔格式。
不幸的是,opencv使处理黑白按位数据变得非常困难。