Как через openCV отсортировать найденные контуры и сохранить их отдельно в файлы изображений?

VolodinAS

Новичок
Пользователь
Дек 3, 2020
35
0
6
32
Россия, Тольятти
Указать свою операционную системуWINDOWS 10 x 64
Указать версию Python3.8.0
Укажите версию библиотек с которыми работаете
Код:
Package                          Version
-------------------------------- ---------
aiogram                          2.11.2
aiohttp                          3.6.3
altgraph                         0.17
async-timeout                    3.0.1
atomicwrites                     1.4.0
attrs                            20.3.0
Babel                            2.9.0
beautifulsoup4                   4.9.3
bindglobal                       0.0.3
cattrs                           1.1.2
certifi                          2020.12.5
chardet                          3.0.4
click                            7.1.2
colorama                         0.4.4
configparser                     5.0.1
cycler                           0.10.0
decorator                        4.4.2
discord                          1.0.1
discord.py                       1.5.1
EasyProcess                      0.3
entrypoint2                      0.2.3
facebook-sdk                     3.1.0
filetype                         1.0.5
Flask                            1.1.2
future                           0.18.2
huepy                            1.2.1
idna                             2.10
imageio                          2.9.0
imageio-ffmpeg                   0.4.2
imutils                          0.5.3
iniconfig                        1.1.1
instabot                         0.117.0
instagram-private-api            1.6.0.0
instagram-private-api-extensions 0.3.9
instapy-cli                      0.0.12
itsdangerous                     1.1.0
Jinja2                           2.11.2
keybind                          0.3.0
kiwisolver                       1.3.1
MarkupSafe                       1.1.1
matplotlib                       3.3.3
mock                             4.0.2
MouseInfo                        0.1.3
moviepy                          1.0.1
mss                              6.1.0
multidict                        4.7.6
numpy                            1.19.4
oauthlib                         3.1.0
opencv-python                    4.4.0.46
packaging                        20.7
pefile                           2019.4.18
Pillow                           8.0.1
pip                              20.3.3
playsound                        1.2.2
pluggy                           0.13.1
proglog                          0.1.9
py                               1.9.0
PyAutoGUI                        0.9.52
PyGetWindow                      0.0.9
pyinstaller                      4.1
pyinstaller-hooks-contrib        2020.10
PyMsgBox                         1.0.9
pynput                           1.6.8
pyparsing                        2.4.7
pyperclip                        1.8.1
pypref                           3.1.0
PyQt5                            5.15.2
PyQt5-sip                        12.8.1
PyQt5-stubs                      5.14.2.2
PyRect                           0.1.4
pyscreenshot                     2.2
PyScreeze                        0.1.26
PySocks                          1.7.1
pyTelegramBotAPI                 3.7.4
pytesseract                      0.3.6
pytest                           6.1.2
python-anticaptcha               0.7.1
python-dateutil                  2.8.1
python-facebook-api              0.7.2
python-xlib                      0.29
PyTweening                       1.0.3
pytz                             2020.4
pywin32-ctypes                   0.2.0
requests                         2.25.0
requests-oauthlib                1.3.0
requests-toolbelt                0.9.1
responses                        0.11.0
schedule                         0.6.0
scipy                            1.5.4
setuptools                       50.3.2
six                              1.15.0
soupsieve                        2.0.1
toml                             0.10.2
tqdm                             4.54.1
typing-extensions                3.7.4.3
urllib3                          1.26.2
vk                               2.0.2
vk-api                           11.9.1
Werkzeug                         1.0.1
wheel                            0.36.1
yarl                             1.5.1
Вставьте фрагмент кода который у вас имеется на данный моментОписание вопроса ниже

Еще раз здравствуйте.
Свои основные изыскания в этом топике (https://itfy.org/threads/kak-vydelit-chast-massiva-iz-dvumernogo-massiva.1806/), но я так понимаю, я неправильно выразился и непонятно вообще, что я хотел.

А вопрос в следующем: есть капча, в каждой из которых 2 числа. Я уже могу выделять контуры. Теперь моя задача сохранить эти контуры отдельно в файл. Есть ли какой-то способ для этого?

Сам код:
Python:
from PIL import Image
import pytesseract
import cv2
import os
import pyscreenshot as ps
import numpy as np
import time
import sys
import random
from CoolFilePathParser import CFPP
from Config import Config
from jprint import jprint
from imagelab import image_lab_file, image_lab_image
import json

window_width = 400
window_height = 300


def get_contour_precedence(contour, cols):
    tolerance_factor = 10
    origin = cv2.boundingRect(contour)
    return ((origin[1] // tolerance_factor) * tolerance_factor) * cols + origin[0]


def get_random_file():
    numbers_dirs = os.listdir(Config.collections_dir)
    random.shuffle(numbers_dirs)
    number_path = Config.collections_dir + '/' + numbers_dirs[0]
    captcha_dirs = os.listdir(number_path)
    random.shuffle(captcha_dirs)
    captcha_name = captcha_dirs[0]
    return str(number_path + '/' + captcha_name)


dark41_file = Config.testcaptcha_dir + '/dark41.jpg'
light41_file = Config.testcaptcha_dir + '/light41.jpg'

captcha_path = get_random_file()

print(captcha_path)

cfpp = CFPP(captcha_path)
ParsePath = cfpp.get_cleanData
jprint(ParsePath, 'ParsePath')

# Оригинал изображения
image_light41 = cv2.imread(captcha_path, cv2.IMREAD_COLOR)
image_light41_big = cv2.resize(image_light41, (window_width, window_height))
cv2.imshow('image_light41_big', image_light41_big)

# Контрастируем через LAB
image_light41_lab = image_lab_file(filename=captcha_path)
image_light41_lab_gray = cv2.cvtColor(image_light41_lab, cv2.COLOR_RGB2GRAY)
image_light41_lab_gray_big = cv2.resize(image_light41_lab_gray, (window_width, window_height))
cv2.imshow('image_light41_lab_gray_big', image_light41_lab_gray_big)

# Убираем шумы
se = cv2.getStructuringElement(cv2.MORPH_RECT, (8, 8))
bg = cv2.morphologyEx(image_light41_lab_gray_big, cv2.MORPH_DILATE, se)
out_gray = cv2.divide(image_light41_lab_gray_big, bg, scale=255)
cv2.imshow('out_gray', out_gray)

out_binary = cv2.threshold(out_gray, 0, 255, cv2.THRESH_OTSU)[1]
cv2.imshow('out_binary', out_binary)

# Выделяем контуры
rgb = cv2.cvtColor(out_binary, cv2.COLOR_GRAY2RGB)
cv2.imshow('rgb COLOR_GRAY2RGB', rgb)

hsv = cv2.cvtColor(rgb, cv2.COLOR_RGB2HSV)
cv2.imshow('hsv COLOR_RGB2HSV', hsv)

hsv_min = np.array((0, 0, 0), np.uint8)
hsv_max = np.array((20, 20, 20), np.uint8)

thresh = cv2.inRange(hsv, hsv_min, hsv_max)
contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

image_light41_big_sort = image_light41_big.copy()
image_light41_big_sort_2 = image_light41_big.copy()

cv2.drawContours(image_light41_big, contours, -1, (255, 0, 0), 1, cv2.LINE_AA, hierarchy, 1)
cv2.imshow('contours', image_light41_big)  # выводим итоговое изображение в окно

cv2.waitKey(0)
cv2.destroyAllWindows()

Результат его работы:
1608371107835.png
 

VolodinAS

Новичок
Пользователь
Дек 3, 2020
35
0
6
32
Россия, Тольятти
up
 

VolodinAS

Новичок
Пользователь
Дек 3, 2020
35
0
6
32
Россия, Тольятти
up 2
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Теперь моя задача сохранить эти контуры отдельно в файл. Есть ли какой-то способ для этого?
В этой строке:
Python:
contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
в переменную contours записывается список всех контуров найденных на картинке.
Его можно отсортировать по длине:
Python:
contours.sort(key=lambda x: len(x))
и записать в файлы 2 самых длинных контура:
Python:
for number, contour in enumerate(contours[-2:]):
    with open(f'contour{number}.txt', 'w', encoding='utf-8') as f:
        for row in contour:
            np.savetxt(f, row)
Чтобы потом считать координаты контура из файла в массив можно использовать такой код:
Python:
import numpy as np


x = 0
with open("contour0.txt") as f:
    x = len(list(f))

contour = np.loadtxt("contour0.txt").reshape(x, 2)
print(contour)
 

Форум IT Специалистов