编码人员通常会将一堆选项塞进一个变量中。如果你看一下二进制格式分配给各种ThresholdTypes的常量,就更容易理解了
import cv2
print('THRESH_BINARY: ', format(cv2.THRESH_BINARY, '#08b'))
print('THRESH_BINARY_INV: ', format(cv2.THRESH_BINARY_INV, '#08b'))
print('THRESH_TRUNC: ', format(cv2.THRESH_TRUNC, '#08b'))
print('THRESH_TOZERO: ', format(cv2.THRESH_TOZERO, '#08b'))
print('THRESH_TOZERO_INV: ', format(cv2.THRESH_TOZERO_INV, '#08b'))
print('THRESH_MASK: ', format(cv2.THRESH_MASK, '#08b'))
print('THRESH_OTSU: ', format(cv2.THRESH_OTSU, '#08b'))
print('THRESH_TRIANGLE: ', format(cv2.THRESH_TRIANGLE, '#08b'))
给出:
THRESH_BINARY: 0b000000
THRESH_BINARY_INV: 0b000001
THRESH_TRUNC: 0b000010
THRESH_TOZERO: 0b000011
THRESH_TOZERO_INV: 0b000100
THRESH_MASK: 0b000111
THRESH_OTSU: 0b001000
THRESH_TRIANGLE: 0b010000
管道 (|) 是按位或,如果一个或两个输入位为 1,则将输出位设置为 1,否则为 0。在您的示例中,选项 THRESH_BINARY_INV 和 THRESH_OTSU 都可以使用按位或。在这种情况下,设置第 1 位和第 4 位并将0b001001 发送到函数。
如果你尝试使用它会变得有点奇怪
cv2.THRESH_BINARY | cv2.THRESH_BINARY_INV
在这种情况下,第一位被设置 (0b00000001),您将获得一个反转阈值。在这种情况下,cv2.THRESH_BINARY 被有效地忽略了。
Qt 库中有一个不太容易混淆的例子,InputMethodHints 的可能值都是按位互斥的:
from PyQt5.QtCore import Qt
print('Qt.ImhHiddenText: ', format(Qt.ImhHiddenText, '#011b'))
print('Qt.ImhSensitiveData: ', format(Qt.ImhSensitiveData, '#011b'))
print('Qt.ImhNoAutoUppercase: ', format(Qt.ImhNoAutoUppercase, '#011b'))
print('Qt.ImhPreferNumbers: ', format(Qt.ImhPreferNumbers, '#011b'))
print('Qt.ImhPreferUppercase: ', format(Qt.ImhPreferUppercase, '#011b'))
print('Qt.ImhPreferLowercase: ', format(Qt.ImhPreferLowercase, '#011b'))
print('Qt.ImhNoPredictiveText: ', format(Qt.ImhNoPredictiveText, '#011b'))
print('Qt.ImhDate: ', format(Qt.ImhDate, '#011b'))
print('Qt.ImhTime: ', format(Qt.ImhTime, '#011b'))
Qt.ImhHiddenText: 0b000000001
Qt.ImhSensitiveData: 0b000000010
Qt.ImhNoAutoUppercase: 0b000000100
Qt.ImhPreferNumbers: 0b000001000
Qt.ImhPreferUppercase: 0b000010000
Qt.ImhPreferLowercase: 0b000100000
Qt.ImhNoPredictiveText: 0b001000000
Qt.ImhDate: 0b010000000
Qt.ImhTime: 0b100000000
您可以按位 2 或更多或所有选项而不会发生冲突。