Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2020, 04:09   #1
VolodyaBuzin
Пользователь
 
Регистрация: 10.11.2017
Сообщений: 56
По умолчанию Обработка растровых изображений с применением библиотеки OpenCV: проблемы с апроксимацией и нахождением вершин фигуры

Добрый день! Я - новичок в Python и начал изучать OpenCV по примерам на этом сайте:
https://tproger.ru/translations/find...python-opencv/
Первые три примера благополучно создались, но с циклом поиска книг начались проблемы, которые связаны с функцией arclenght. Подскажите, пожалуйста, где на что нужно заменить. Это мой первый опыт, инструкции к библиотеке не читал, работаю в Anaconda 2019 и Python 3.7 через программу PyCharm Community (картинка лежит в одной папке с проектом), проверяю её работоспособность на этом примере:

Исходный код:
Код:
# -*- coding: utf-8 -*-
# импортируйте необходимые пакеты
import numpy as np
import cv2
 
# загрузите изображение, смените цвет на оттенки серого и уменьшите резкость
image = cv2.imread("1-3.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (3, 3), 0)
cv2.imwrite("gray.jpg", gray)
 
# распознавание контуров
edged = cv2.Canny(gray, 10, 250)
cv2.imwrite("edged.jpg", edged)
 
# создайте и примените закрытие
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
closed = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)
cv2.imwrite("closed.jpg", closed)
 
# найдите контуры в изображении и подсчитайте количество книг
cnts = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
total = 0
 
# цикл по контурам
for c in cnts:
    # аппроксимируем (сглаживаем) контур
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.02 * peri, True)
 
    # если у контура 4 вершины, предполагаем, что это книга
    if len(approx) == 4:
        cv2.drawContours(image, [approx], -1, (0, 255, 0), 4)
        total += 1
 
# показываем результирующее изображение
print("Я нашёл {0} книг на этой картинке".format(total))
cv2.imwrite("output.jpg", image)
Ошибки:
Код:
D:\Python\python.exe C:/untitled/opencv_demo1.py
Traceback (most recent call last):
  File "C:/untitled/opencv_demo1.py", line 28, in <module>
    peri = cv2.arcLength(c, True)
cv2.error: OpenCV(4.1.2) D:\Build\OpenCV\opencv-4.1.2\modules\imgproc\src\shapedescr.cpp:239: error: (-215:Assertion failed) count >= 0 && (depth == CV_32F || depth == CV_32S) in function 'cv::arcLength'
 
 
Process finished with exit code 1
VolodyaBuzin вне форума Ответить с цитированием
Старый 29.01.2020, 05:21   #2
VolodyaBuzin
Пользователь
 
Регистрация: 10.11.2017
Сообщений: 56
По умолчанию

Почему через runfile в web-интерфейсе Jupyter Notebook ничего не получилось? Я пробовал
runfile("C:/untitled/opencv_demo1.py", wdir="C:/untitled")
Компилятор выдал, что эта функция не определена.
NameError Traceback (most recent call last)
<ipython-input-3-3b5b44b0deb8> in <module>
----> 1 runfile("C:/untitled2/calculator.py", wdir="C:/untitled2")

NameError: name 'runfile' is not defined
VolodyaBuzin вне форума Ответить с цитированием
Старый 29.01.2020, 07:04   #3
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Цитата:
Сообщение от VolodyaBuzin Посмотреть сообщение
Ошибки:
Пример по Вашей ссылке с косяками.
Не правильно:
Код:
cnts = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
Правильно:
Код:
cnts = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
Не правильно:
Код:
print("I find {0} books in this picture".format(total)
cv2.imwrite("output.jpg", image))
Правильно:
Код:
print("I find {0} books in this picture".format(total))
cv2.imwrite("output.jpg", image)
I am not a wizard, I am just learning.

Последний раз редактировалось Desc; 29.01.2020 в 07:25.
Desc вне форума Ответить с цитированием
Старый 29.01.2020, 07:28   #4
VolodyaBuzin
Пользователь
 
Регистрация: 10.11.2017
Сообщений: 56
По умолчанию

Синтаксическую ошибку со скобкой я давно увидел и исправил, основная проблема была с циклом. Спасибо за ответ!
VolodyaBuzin вне форума Ответить с цитированием
Старый 29.01.2020, 07:41   #5
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Только Вы учтите что это не ИИ, книгами алгоритм будет называть все что вписывается в прямоугольный контур.
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение растровых изображений в делфи Katerina_K Помощь студентам 2 25.10.2013 14:24
Обработка растровых изображений и анимация в C++ Kravanet Visual C++ 0 01.12.2011 23:31
Какие форматы файлов растровых изображений нецелочисленные пиксели? Shuraken13 Помощь студентам 0 18.05.2011 14:23
Разработать программу для обработки растровых изображений, хранящихся в файлах формата BMP (BitMaP). yeskin Фриланс 5 19.12.2010 15:06
Площадь фигуры по координатам вершин Maksss123 Фриланс 8 09.03.2010 21:30