OpenCV 2.4.3 и Python
Несколько дней назад я искал хороший способ создать простую систему компьютерного зрения. Библиотека OpenCV - это то, что мне нужно, но было сложно учиться с Python, особенно после обновления OpenCV 2.4.3, имеющего очень тонкую документацию, связанную с Python. Итак, теперь я понимаю, что в OpenCV произошла куча изменений, для exaxmple
import cv
теперь
import cv2
И есть куча модулей, которые отсутствуют. Я имею в виду, да, есть примеры нового синтаксиса python-opencv, но он очень узкий и, как оказалось, трудно понять.
Например:
Пример в официальной документации для кода Python
cv2.cvtColor(src, code[, dst[, dstCn]])
Я знаю, что означает этот код и как его использовать, по крайней мере, я думаю, что знаю. Но писать исходный код и цветовой код ничего не дает мне:
Traceback (most recent call last):
File "C:\FILEFOLDER\tut.py", line 11, in <module>
cv.cvtColor('proba.jpg', 'CV_RGB2GRAY')
TypeError: an integer is required
Или, если я пытаюсь написать код как переменную:
Traceback (most recent call last):
File "C:\FILEFOLDER\tut.py", line 11, in <module>
cv.cvtColor('proba.jpg', CV_RGB2GRAY)
NameError: name 'CV_RGB2GRAY' is not defined
Итак, есть ли справочный документ/учебник/книга/руководство по Python для новейшего OpenCV с объяснениями, которые не путают новичков, подобных мне, с нежелательными примерами кода для С++ или Java?
Ответы
Ответ 1
Я думаю, что вы делаете это на обратном пути.
На самом деле, с новым модулем cv2
, OpenCV стал намного более простым по сравнению со старым интерфейсом cv
. Не просто, но очень быстро и высокопроизводительно, благодаря поддержке Numpy. Дело только в том, что мы должны знать, как правильно использовать его.
Здесь вы должны использовать функцию следующим образом:
img = cv2.imread('pic.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
Я хотел бы, чтобы вы посетили один SOF, который показывает некоторое сравнение между обоими модулями: Чем отличаются все эти интерфейсы OpenCV Python?
Здесь еще один SOF, который является простой демонстрацией того, как вы можете ускорить работу с поддержкой Numpy: Сравнение производительности интерфейсов OpenCV-Python cv и cv2
Вам не нужно изучать С++ или C для использования OpenCV, хотя С++ является официальным языком. Тем не менее, Python-OpenCV имеет хорошую поддержку. Как только вы поймете, как использовать OpenCV, вы сможете конвертировать коды С++ в Python самостоятельно. Затем вы также можете изучить OpenCV из учебников по С++. Например, я начал изучать OpenCV из "Learning OpenCV" Гэри Брэдски, который полностью находится на С++. В то время был только интерфейс cv
.
Как вы упомянули в своих комментариях, opencvpython.blogspot.com имеет несколько вводных руководств. Я начал фокусировать новичков в OpenCV.
Кроме того, проверьте этот SOF для получения дополнительных уроков: Книги для OpenCV и Python?
Ответ 2
Сделать это под другим углом и позволить вам запускать старый код с новыми версиями установки OpenCV...
Прежде всего переход от cv к cv2 относится к библиотеке, использующей разные структуры данных для множества функций. Самый простой способ определить, изменилась ли функция между cv2 и cv, состоит в том, что функции cv начинаются с капитала. Переработанные функции cv2, похоже, всегда имеют первую букву в нижнем регистре. Поэтому, если вы используете старую книгу или старые примеры, вы все равно можете использовать устаревшие cv. cv теперь просто вложено в cv2. Просто используйте следующее в верхней части своих скриптов.
import cv2
import cv2.cv as cv #required for old code not to be changed
Это позволяет вам просто запускать старый код без его изменения. Здесь я продемонстрирую ваш вызов функции. У вас был...
cv.cvtColor('proba.jpg', 'CV_RGB2GRAY')
Первое, что я замечаю, это то, что ваша функция может быть названа неправильной. (Учитывая, что первая буква функции имеет нижний регистр, она должна начинаться с cv2, а не cv). Второй - это "код", передаваемый функцией. "Коды" - это члены (кодирование noob здесь, простите меня, если какой-то мой vocab неточен) cv2 и cv, но не всегда одинаковый. У вас есть CV_RGB2GRAY. Во-первых, никаких кавычек. Это код cv 'не cv2. Также вам не хватает "cv". спереди. Чтобы продемонстрировать здесь, как я считаю, ваша функция должна быть вызвана для старой версии cv:
cv.CvtColor('proba.jpg', cv.CV_RGB2GRAY) #Assuming you used listed imports
cv2.cv.CvtColor('proba.jpg', cv2.cv.CV_RGB2GRAY) #Assuming you skipped second import
И теперь cv2...
cv2.cvtColor('proba.jpg', cv2.COLOR_RGB2GRAY)
Там вы идете, я надеюсь, что это поможет. Помните, что при запуске сценариев python вы можете вводить все, что вы не уверены, непосредственно в командной строке. Это творит чудеса, помогая мне построить мое понимание (я впервые использовал python 5 дней назад). Например, если вам интересно, почему в вашей функции требуется целое число, когда вы печатаете
cv.CV_RGB2GRAY
непосредственно в командной строке python, он нажимает на вас "7" (удобный, что это int). Версия cv2 выплевывает "7L". Просто не забудьте использовать функцию WaitKey() снова и снова в той или иной форме, иначе у highgui может не быть необходимого времени для обработки некоторых команд, в некоторых ситуациях. Хорошо, что обертывает его. Извините, если я рассмотрел некоторые вещи, которые уже были охвачены или были упомянуты. Если я не стесняюсь удалить его, администраторы.