С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 14.06.2020
Сообщений: 5

Построение среднего кадра по предыдущему и последующему кадру

14.06.2020, 08:38. Показов 1411. Ответов 8

Студворк — интернет-сервис помощи студентам
Здравствуйте, я самый новенький из всех новичков в Python'e, да и в программировании в целом. Буквально ночью скачал PyCharm и начал пытаться реализовывать код.
ТЗ:
Есть первый и третий кадр


На них находятся несколько объектов (кружочков), внешне похожих, но они разные.
Положение объектов относительно друг друга не меняется.
Объекты движутся по линейной траектории.
Нужно вычислить координаты положения объектов на середине между первым и вторым кадром.
И самое главное, нужно создать этот кадр - новое изображение, на котором объекты будут находится на вычисленных координатах.
Я вроде немного справился с кодом.
Смог разобраться как вычислить объекты на изображении, подсветить их контура и вычислить середины объектов
Занес данные о координатах центра объектов в два массива, соответственно с первого и третьего кадра.
Сделал вывод изображений с подсвеченными контурами объектов и вывод массивов с координатами центра объектов для наглядности.
Вот код, который у меня получился:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from PIL import ImageGrab
import cv2
import os
import time
import numpy as np
def find1():
    font = cv2.FONT_HERSHEY_COMPLEX
    image = cv2.imread("1.jpg", cv2.IMREAD_COLOR)
    gray = cv2.imread('1.jpg', cv2.IMREAD_GRAYSCALE)
    coord,threshold = cv2.threshold(gray, 110, 255, cv2.THRESH_BINARY)
    contours,tresh = cv2.findContours(threshold, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    for cnt in contours:
        approx = cv2.approxPolyDP(cnt, 0.009 * cv2.arcLength(cnt, True), True)
        cv2.drawContours(image, [approx], 0, (0, 0, 255), 5)
        n = approx.ravel()
        i=0
        for j in n:
            if(i%2==0):
                x=n[i]
                y=n[i+1]
        string = str(x)+" "+str(y)
        print(string)
    cv2.imshow('image2',image)
    if cv2.waitKey(0)&0xFF == ord('q'):
        cv2.destroyAllWindows()
def find2():
    font1 = cv2.FONT_HERSHEY_COMPLEX
    image1 = cv2.imread("3.jpg", cv2.IMREAD_COLOR)
    gray1 = cv2.imread('3.jpg', cv2.IMREAD_GRAYSCALE)
    coord1,threshold1 = cv2.threshold(gray1, 110, 255, cv2.THRESH_BINARY)
    contours1,tresh1 = cv2.findContours(threshold1, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    for cnt1 in contours1:
        approx1 = cv2.approxPolyDP(cnt1, 0.009 * cv2.arcLength(cnt1, True), True)
        cv2.drawContours(image1, [approx1], 0, (0, 0, 255), 5)
        n1 = approx1.ravel()
        i1=0
        for j in n1:
            if(i1%2==0):
                x1=n1[i1]
                y1=n1[i1+1]
        string1 = str(x1)+" "+str(y1)
        print(string1)
    cv2.imshow('image3',image1)
    if cv2.waitKey(0)&0xFF == ord('q'):
        cv2.destroyAllWindows()
find1()
wait = input("PRESS ENTER TO CONTINUE.")
find2()
Результат работы программы:




А далее для меня начинается темный лес, я не понимаю как мне запомнить объекты с изображения (т.е их размер, форму и т.д) и перенести на новые координаты. Копался в интернете, но из за скудных познаний в программировании не смог ничего понять и найти полезного. Везде описываются именно способы нахождения объектов на изображении, но нигде нет описания как их перемещать.
Примерный кадр, который должен получиться в результате работы программы (нарисовал в Paint'e):

Если кто то сможет помочь с данной задачей, буду рад отблагодарить.
Код нужен для дипломной работы, хотя мое направление никоим образом не пересекается с информатикой/программированием. До этого максимум, в чем я писал код, была среда Matlab. Мой научный руководитель предложил для последней главы диплома разработать такой алгоритм в этой среде. Я зачем-то согласился. После нескольких дней упорных попыток реализовать этот алгоритм в Matlab'e, пришел к выводу, что там он просто не реализуем. Знакомые подсказали, что можно попробовать реализовать его в Python'e с помощью OpenCV, отсюда и началось мое знакомство с данной средой.
Не пинайте сильно, это первый мой пост, да и один из первых кодов в моей жизни)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.06.2020, 08:38
Ответы с готовыми решениями:

xsl:for-each доступ предыдущему/последующему элементу
Здравствуйте! Подскажите пожалуйста как мы сделать вместо: Create table CI_have_CI_have AI_the_AI_the чтобы получилось ...

Map iterator обращение к предыдущему или последующему элементу
for(map<string,int>::iterator i = m.begin();i!=m.end();i++) if( (i+1) == m.end() ) cout << "End"; Как сделать что-то...

Функция рассеяния точки (airy-function) в OpenGL, построение кадра в ИК-диапазоне
Здравствуйте! Есть задача: имея набор объектов разной температуры и разного удаления от наблюдателя, построить их изображение на ИК-матрице...

8
5514 / 2867 / 571
Регистрация: 07.11.2019
Сообщений: 4,757
14.06.2020, 08:50
Кадры отличаются только трансляцией или еще вращением и формой объектов?
0
0 / 0 / 0
Регистрация: 14.06.2020
Сообщений: 5
14.06.2020, 08:54  [ТС]
Нет, отличаются только положением объектов в кадре.
Не вращаются и форму не меняют.
0
5514 / 2867 / 571
Регистрация: 07.11.2019
Сообщений: 4,757
14.06.2020, 08:57
Если только трансляцией, то можно сделать FFT2 посчитать среднюю фазу и преобразовать обратно. В матлабе всего строчек 5, наверное, будет.
0
0 / 0 / 0
Регистрация: 14.06.2020
Сообщений: 5
14.06.2020, 09:02  [ТС]
Если можно, опишите немного подробнее, пожалуйста.
Как это реализовать при использовании предыдущего и последующего кадра.
Как я понимаю, мы сначала поочередно их считываем, потом используем 2D преобразование Фурье и получаем координаты.
А дальше как быть? У меня самая большая проблема именно с построением нового изображения.
0
5514 / 2867 / 571
Регистрация: 07.11.2019
Сообщений: 4,757
14.06.2020, 10:03
Requestin,
Напрямую, как я хотел, не получилось, возникла проблема с правильной интерполяцией фаз..
Но можно и так, переписать на Python с использованием scipy, numpy, думаю, будет просто:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
kadr1=imread('1.jpg');
kadr3=imread('3.jpg');
kadr=kadr1;
kadr1=rgb2gray(kadr1); 
kadr3=rgb2gray(kadr3);
pos=fftshift(normxcorr2(kadr1, kadr3));
[m, idx]=max(pos(:));
[k,n]=ind2sub(size(pos), idx)
k=int32(k/2);
n=int32(n/2);
kadr2=circshift(kadr, [k, n, 0]);
imshow(kadr2);
Прошу прощения за оффтопик..
Миниатюры
Построение среднего кадра по предыдущему и последующему кадру  
0
0 / 0 / 0
Регистрация: 14.06.2020
Сообщений: 5
14.06.2020, 10:11  [ТС]
Большое спасибо за помощь!
В Matlab'e тоже отлично подойдет, обойдусь реализацией в нем
Еще один небольшой вопрос, реализуем ли в Matlabe алгоритм экстраполяции с предсказанием?
Имеется ввиду, опять есть те же данные два кадра, те же объекты и условия, но построить уже нужно следующий кадр, предсказывая положение объектов в новом кадре.
Если да, то насколько это сложно?
0
5514 / 2867 / 571
Регистрация: 07.11.2019
Сообщений: 4,757
14.06.2020, 10:23
Requestin, по хорошему, это делается с помощью вычисления оптического потока Optical Flow. В Матлабе что-то было на эту тему, но я с видео не работал. Но, там разница между кадрами должна быть небольшой, а не как у вас.
А так, [k,n] - вектор трансляции, умножите его на число меньше единицы (я делил на 2) - интерполяция, больше единицы - аппроксимация (с учетом зацикливания кадра, разумеется).
https://www.mathworks.com/help... eflow.html
0
0 / 0 / 0
Регистрация: 14.06.2020
Сообщений: 5
14.06.2020, 10:29  [ТС]
Спасибо, буду пробовать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.06.2020, 10:29
Помогаю со студенческими работами здесь

Программа, которая имеет методы подсчета среднего арифметического, среднего геометрического, среднего квадратичного
Доброго времени суток, написал программу подсчета которая умеет считать среднее арифметического, среднее геометрического, среднее...

Игнорирует действие и переходит к последующему
В программу вводится запись из названия товара, количества товара, номера склада. Эти значения записываются в файл. Потом в программу...

Заполнение столбцов таблицы по последующему значению
Подскажите, пожалуйста, как можно реализовать SQL-запрос, который для таблицы типа: N Дата (mm.dd.yy\ h:nn\ AM/PM;@), Значение1,...

Угадай фильм по кадру
Доброго здравия, ребятки! Есть идея приложения - угадай фильм. Оффлайн. С бд в апк. Попробовал реализацию через парсинг xml, через...

Угадай фильм по кадру
Отгадавший загадывает итак я начну


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru