4

我试图将 cv::bitwise_not 转换为双值的 cv::Mat 矩阵。我申请像

cv::bitwise_not(img, imgtemp);

imgCV_64F0和1的数据。但是imgtemp里面全是废话数据。我期望 0 inimg是 1 at imgtemp和 1 inimg是 0 at imgtemp。如何将 bitwise_not 应用于双 Mat 矩阵?谢谢

4

3 回答 3

4

我无法理解按位而不是双(浮点)值:您还将对指数进行按位运算(请参见此处)。所有将被反转,从 0 到 1,反之亦然。功能文档中也有关于这方面的说明。

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

如果您希望零变成一,反之亦然,如您所建议的,您可以这样做:

cv::threshold(warpmask, warpmaskTemp,0.5,1.0,THRESH_BINARY_INV)

(请参阅文档)(是的,您可以使用相同的矩阵作为输入和目标)。

于 2013-07-23T08:23:48.057 回答
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())

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

此外,所有数据类型都需要相同以避免混淆。我试图暗示的是,您的源数据格式和目标数据格式以及任何中间数据格式(例如方法参数)必须采用相同的格式。你不能在 ein CV_64F 和其他不同的地方拥有。如果我没有在这里丢失我的弹珠,为了简单起见,按位运算可能要求您将所有数据都设为无符号或有符号整数格式。不过,您应该使所有类型都相同。

关于你得到的垃圾,我认为用一些合理的值初始化你的变量是一种通用且良好的编程习惯。这有助于您逐步调试并确定失败的详细信息。

试试看。

于 2013-07-23T07:27:00.800 回答
0

要继续安东尼奥的回答,您应该使用正确的工具来完成这项工作。double 不是布尔数据的合适存储介质。

在 open cv 中,您可以将布尔值键入为无符号字符(8 位)。尽管在输入自己的真实值时可以选择任何非零值,但在 open cv 中更自然的是 0/255;这种方式适合 open cv 的按位运算和比较运算符。result = (input == 0)例如,可以采用任何类型来实现按位不。安东尼奥的答案中的阈值保持相同的类型(在某些情况下有用)。对于 bitwise_not,您应该首先将其设为布尔格式。

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

于 2019-07-16T01:39:00.710 回答