为什么openCV2的Line(antialiased)函数在CV_16UC1和CV_8UC1上给出不同的结果而没有溢出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么openCV2的Line(antialiased)函数在CV_16UC1和CV_8UC1上给出不同的结果而没有溢出相关的知识,希望对你有一定的参考价值。

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.pybrew 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.CV_AA)                                                                                                                                                 
print themap  

以上是关于为什么openCV2的Line(antialiased)函数在CV_16UC1和CV_8UC1上给出不同的结果而没有溢出的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV2升级到OpenCV3遇到“未定义的标识符”

openCV 相当于 PIL 调整大小 ANTIALIAS?

关于skia antialias

windows10下VS2013搭建opencv2.4.9吐血之作

图像的 OpenCV Line-Mod 问题

cocos creator 抗锯齿