为什么 openCV2 的 Line (antialiased) 函数在 CV_16UC1 和 CV_8UC1 上给出不同的结果而没有溢出
Why the Line (antialiased) function of openCV2 gives different results on CV_16UC1 and CV_8UC1 without overflow
themap = cv.CreateMat(8,8,cv.CV_8UC1)
cv.SetZero(themap)
cv.Line(themap,(0,0),(7,7),(10),1,cv.CV_AA) #draw a line
print np.asarray(themap[:,:])
#######output
[[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 2 7 2 0 0 0 0]
[ 0 0 3 10 3 0 0 0]
[ 0 0 0 3 10 3 0 0]
[ 0 0 0 0 2 7 2 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]]
但是,当我将图像类型更改为cv.CV_16UC1
时,结果完全不同:
themap = cv.CreateMat(8,8,cv.CV_16UC1)
cv.SetZero(themap)
cv.Line(themap,(0,0),(7,7),(10),1,cv.CV_AA) #draw a line
print np.asarray(themap[:,:])
#######output
[[10 0 0 0 0 0 0 0]
[ 0 10 0 0 0 0 0 0]
[ 0 0 10 0 0 0 0 0]
[ 0 0 0 10 0 0 0 0]
[ 0 0 0 0 10 0 0 0]
[ 0 0 0 0 0 10 0 0]
[ 0 0 0 0 0 0 10 0]
[ 0 0 0 0 0 0 0 10]]
我对这样的结果感到非常困惑。由于像素值只有10,所以cv.CV_8UC1
图片类型应该不会出现溢出问题。为什么 cv.Line
的结果会如此不同?
opencv 安装在 /usr/local/Cellar/opencv@2/2.4.13.6_2/lib/python2.7/site-packages/cv.py
和 brew install opencv@2
。
不要使用旧的、已弃用的 OpenCV API。请改用 cv2 模块并直接使用 Numpy 创建图像。使用以下代码,结果符合预期,并且对于 8 位和 16 位图像都是相同的。
themap = np.zeros((8,8), dtype=np.uint16)
cv2.line(themap, (0,0), (7,7), (10), lineType=cv2.LINE_AA)
print themap
themap = cv.CreateMat(8,8,cv.CV_8UC1)
cv.SetZero(themap)
cv.Line(themap,(0,0),(7,7),(10),1,cv.CV_AA) #draw a line
print np.asarray(themap[:,:])
#######output
[[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 2 7 2 0 0 0 0]
[ 0 0 3 10 3 0 0 0]
[ 0 0 0 3 10 3 0 0]
[ 0 0 0 0 2 7 2 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]]
但是,当我将图像类型更改为cv.CV_16UC1
时,结果完全不同:
themap = cv.CreateMat(8,8,cv.CV_16UC1)
cv.SetZero(themap)
cv.Line(themap,(0,0),(7,7),(10),1,cv.CV_AA) #draw a line
print np.asarray(themap[:,:])
#######output
[[10 0 0 0 0 0 0 0]
[ 0 10 0 0 0 0 0 0]
[ 0 0 10 0 0 0 0 0]
[ 0 0 0 10 0 0 0 0]
[ 0 0 0 0 10 0 0 0]
[ 0 0 0 0 0 10 0 0]
[ 0 0 0 0 0 0 10 0]
[ 0 0 0 0 0 0 0 10]]
我对这样的结果感到非常困惑。由于像素值只有10,所以cv.CV_8UC1
图片类型应该不会出现溢出问题。为什么 cv.Line
的结果会如此不同?
opencv 安装在 /usr/local/Cellar/opencv@2/2.4.13.6_2/lib/python2.7/site-packages/cv.py
和 brew install opencv@2
。
不要使用旧的、已弃用的 OpenCV API。请改用 cv2 模块并直接使用 Numpy 创建图像。使用以下代码,结果符合预期,并且对于 8 位和 16 位图像都是相同的。
themap = np.zeros((8,8), dtype=np.uint16)
cv2.line(themap, (0,0), (7,7), (10), lineType=cv2.LINE_AA)
print themap