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

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

14.06.2020, 08:38. Показов 1448. Ответов 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
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,759
14.06.2020, 08:50
Кадры отличаются только трансляцией или еще вращением и формой объектов?
0
0 / 0 / 0
Регистрация: 14.06.2020
Сообщений: 5
14.06.2020, 08:54  [ТС]
Нет, отличаются только положением объектов в кадре.
Не вращаются и форму не меняют.
0
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,759
14.06.2020, 08:57
Если только трансляцией, то можно сделать FFT2 посчитать среднюю фазу и преобразовать обратно. В матлабе всего строчек 5, наверное, будет.
0
0 / 0 / 0
Регистрация: 14.06.2020
Сообщений: 5
14.06.2020, 09:02  [ТС]
Если можно, опишите немного подробнее, пожалуйста.
Как это реализовать при использовании предыдущего и последующего кадра.
Как я понимаю, мы сначала поочередно их считываем, потом используем 2D преобразование Фурье и получаем координаты.
А дальше как быть? У меня самая большая проблема именно с построением нового изображения.
0
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,759
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
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,759
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
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru