Аргументы в cv2 :: imshow
Редактировать: оригинальное название "конвертировать массив numpy в cvmat" было ошибкой - OpenCV меньше, чем полезное сообщение об ошибке, и я не читал документы!
В OpenCV 2 IPython по умолчанию использует массивы NumPy.
cvimage = cv2.imread("image.png") #using OpenCV 2
type(cvimage)
Out: numpy.ndarray #dtype is uint8
pltimage = plt.imread("image.png") #using Matplotlib
type(pltimage)
Out: numpy.ndarray #dtype is float
plt.imshow(cvimage) # works great
cv2.imshow(cvimage)
TypeError: Required argument 'mat' (pos 2) not found
Поскольку cv2
по умолчанию использует массивы NumPy, больше нет конструктора cv :: Mat, и у NumPy нет функций для преобразования в массив cv::Mat
.
Есть идеи?
Ответы
Ответ 1
Функция имеет следующую imshow(winname, mat) → None
документации: imshow(winname, mat) → None
. Вы можете увидеть строку документа, введя cv2.imshow.__doc__
в интерпретаторе.
Попробуйте cv2.imshow('Image', cvimage)
.
tl; dr: В исходном вопросе первый аргумент "имени окна" отсутствовал. "imshow" принимает два параметра, и только один был предоставлен.
Ответ 2
Вопрос технически задает вопрос о том, как преобразовать массив NumPy (аналогичный массиву CV2) в объект Mat (CV). Для любого, кто заинтересован, это можно сделать:
mat_array = cv.fromarray(numpy_array)
где mat_array - объект Mat, а numpy_array - массив или изображение NumPy.
Я хотел бы предлагать избегать старых структур CV, где это возможно. Массовые массивы имеют гораздо лучшую производительность, чем реализация на родном Python
Ответ 3
Mat
нужен объект, потому что на C/С++ отсутствует стандартная/нативная реализация матриц.
Однако numpy
array
является идеальной заменой для этой функциональности. Следовательно, модуль cv2
принимает numpy.array
везде, где в документах указывается матрица.