Почему функция Line (сглаживание) openCV2 дает разные результаты для CV_16UC1 и CV_8UC1 без переполнения - PullRequest
0 голосов
/ 12 июня 2018
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.

1 Ответ

0 голосов
/ 12 июня 2018

Не используйте старый устаревший API OpenCV.Вместо этого используйте модуль 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  
...