Zdjęcie w tle
Python

Społeczność

Python

333

Dla programistów Python

Napisałem sobie taki krótki program do robienia zdjęć z kamerki, gdzie potem sklejam z tego timelapse, ale nie rozumiem jednej rzeczy - zdjęcia zapisują się... z opóźnieniem. Musiałem dolać ukorzeniacza do awokado, więc zabierałem je sprzed kamerki. Po skończonej robocie (9:47) usiadłem do kompa i sprawdziłem poprzednie zdjęcia czy ustawiłem rośliny w miarę w tych samych miejscach. A tu się okazuje, że zdjęcie które powinno być zrobione w momencie skończenia, to tak naprawdę zdjęcie sprzed kilku minut. Łącznie zajęło mu 8 minut (5 zdjęć), zanim dotarł do momentu w którym skończyłem. Dlaczego tak jest? Czegoś tu nie rozumiem?
Kod:
import cv2
from time import sleep
from datetime import datetime

cam = cv2.VideoCapture(0)
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080.0)
cam.set(cv2.CAP_PROP_FRAME_WIDTH, 1920.0)
cam.set(cv2.CAP_PROP_AUTO_WB, 0.0)
cam.set(cv2.CAP_PROP_WB_TEMPERATURE, 7000)
cam.set(cv2.CAP_PROP_SATURATION, 75)
cam.set(cv2.CAP_PROP_CONTRAST, 100)
while True:
   retval, frame = cam.read()
   dt = datetime.now()
   ts = int(datetime.timestamp(dt))
   if retval != True:
      print(str(dt) + ": Can't read frame")
      sleep(5)
      continue
   cv2.imwrite(str(ts) + '.png', frame)
   print(str(dt) + ": saved img " + str(ts) + ".png")
   sleep(120)
#python #programowanie
9e52353b-adf4-4507-b0d0-c53a4af049de
298ca152-8de6-486d-ab2f-5cfddaf7e444
203129d3-d0a7-4a2a-94e6-ee680a320cc4
edbf2503-175a-452d-b48e-c86cd23ecdf2
50e6dc6b-50c7-4419-9057-a4faaeedf354
psalek

@Bielecki domyślnie cam.read odczytuje pierwszą ramkę z bufora a nie najświeższą.

Widziałem dwa rozwiązania. Jedno to osobny wątek do porzucania starych ramek: https://stackoverflow.com/questions/43665208/how-to-get-the-latest-frame-from-capture-device-camera-in-opencv


Drugie to wymuszenie porzucenia ramek bezpośrednio przez cv2. To chyba było przez set property ale tak na szybko nie mogę tego znaleźć.


Oba mi działały. To drugie jest wydajniejsze ale w Twoim przypadku oba powinny być ok.

Prucjusz

@Bielecki cv2 działa bardzo wolno. Spróbuj z numpy.

Jesli dobrze pamiętam, z obiektu cv2 można wyciągnąć tablicę numpy i za jego pomocą to zapisać do pliku.

Bielecki

@markxvyarov dlaczego tak uważasz? Jeśli retval będzie false, to kontynuuję loop, żeby nie wywalać całego programu, ale nie zapisuję obrazu


@Prucjusz najwolniejsze w opencv w moim przypadku jest inicjalizowanie kamery przez cv2.VideoCapture(0). Ja loopuję się już po inicjalizacji, nie zwalniam kamery. Sam zapis odbywa się w ciągu ~0,1s, zakładając że sleep trwa równe 120s (takie mam różnice w timestampach).


@psalek dzięki, to mi wiele powiedziało. Wygląda na to że to właśnie bufor. Niby mogę zastosować te rozwiązania (choć porzucanie ramek przez opencv z tego co znalazłem odbywa się poprzez ustawianie odpowiednich properties kamery i nie jestem pewien czy 1. jest to wspierane przez mój model, 2. jest to nadal w opencv, bo gdzieś była wzmianka, że to usunęli), ale to w sumie byłaby sztuka dla sztuki - a w moim przypadku rozwiązanie się w sumie sprawdza. Zwyczajnie mnie ciekawiło dlaczego tak się dzieje i mam odpowiedź. Dzięki

Zaloguj się aby komentować

W pracy, udało nam się przepisać celery z Pythona na nasz własny menedżer tasków w Rust.
Wydajność jest zauważalnie lepsza, bo korzystamy ze starych komponentów i tam różnice są o wiele bardziej widoczne, niż na zwykłym komputerze, gdzie oba rozwiązania przetwarzają zadania niemal natychmiast.

Zatem mamy część z kodem w Rust, ale ciągle część z obliczeń musimy wykonać w pojedynczym procesie pythona do którego wysyłamy resty z zapytaniami.
Jednak celery miało jeden duży plus - uruchamiało się jako osobne procesy(co wydłużało o kilka sekund proces uruchamiania programu), dzięki czemu operacje numpy/scipy na CPU, były ładnie rozdzielane po stronie pythona na wszystkie wątki(na urządzeniu są 4 rdzenie i tyle samo procesów celery było uruchamianych)

Operacje obliczania statystyk(mowa o powyższym zadaniu korzystającym z numpy/scipy) są często zlecane w większej ilości na raz, dlatego ważne jest by to zrównoleglić.
Próbowałem robić to przez proste rozdzielanie tasków na wiele wątków, jednak, czasy bywały nawet czasami gorsze, niż jak robiłem to w jednym wątku - domyślam się że to wina GIL i tego że nie działa zbytnio dobrze, gdy wątki wykonują masę rzeczy na cpu.
Drugim problemem jest to że w przypadku równoległych działań wyskakują dziwne ostrzeżenia, przez co myślę że np. matplotlib, nie jest przystosowany do działania z wielu wątków(mimo że zadania które wykonuję od początku do końca działają tylko w jednym wątku), bo przechowuje globalnie jakieś parametry ze swoim stanem.

Kojarzycie, w jaki sposób, mógłbym w miarę prosto, móc wykonywać te obliczenia po stronie pythona na wielu wątkach?
#python
markxvyarov

@qarmin jest standardowy moduł w Pythonie, nazywa się multiprocessing. W nim znajdziesz Pool i metody typu starmap i map. Najczęściej z tego korzystam gdy trzeba zrównoległość obliczenia.


https://superfastpython.com/multiprocessing-pool-map/

# SuperFastPython.com

# example of parallel map() with the process pool

from random import random

from time import sleep

from multiprocessing.pool import Pool

# task executed in a worker process

def task(identifier):

    # generate a value

    value = random()

    # report a message

    print(f'Task {identifier} executing with {value}', flush=True)

    # block for a moment

    sleep(value)

    # return the generated value

    return value

# protect the entry point

if __name__ == '__main__':

    # create and configure the process pool

    with Pool() as pool:

        # execute tasks in order

        for result in pool.map(task, range(10)):

            print(f'Got result: {result}', flush=True)

    # process pool is closed automatically


Na zamieszczonym zdjęciu znajdziesz wszystkie metody z klasy Pool które możesz wykorzystać.

eaab2cd3-50c4-480c-aa4f-b776373b7c0f
qarmin

@markxvyarov Działa to lepiej, niż ręczne tworzenie i zarządzanie wątkami?

Boję się że również tutaj GIL pokaże swoje ograniczenia i w rzeczywistości będzie to wszystko działało, niemal tak jak w jednym wątku

Zaloguj się aby komentować

Powerful Python One-Liners

A z jakich jednolinijkowców Wy korzystacie?

#technologia #programowanie #python
24e4fc68-4929-4a23-96a5-695c3f34cd1b
wonsz

import itertools, more-itertools

def

Jedyne do czego używam pythona python3 -m http.server

koszotorobur

@def - to i tak dobrze - bo super wygodne

sebie_juki

@koszotorobur sudo cat /dev/random > /dev/sda1

koszotorobur

@sebie_juki - czy ty aby przypadkiem nie próbujesz wystrychnąć nas na dudka? To nie jest one-liner Pythona ( ͡° ͜ʖ ͡°)

wonsz

@koszotorobur 


import subprocess; subprocess.run('sudo cat /dev/random > /dev/sda1', shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)

Zaloguj się aby komentować

def

O fuj, python, troche sie brzydze

koszotorobur

@def - ja też kiedyś się brzydziłem - ale teraz bez pytonga jak bez ręki

def

@koszotorobur no ok, ja jako język skryptowy wybieram bash, a na coś większego wolę go

Zaloguj się aby komentować

TuzZaRogiem

@koszotorobur zwykły Excel xlsx. Jak ręcznie otworze i usunę ten wiersz to otwieram normalnie później. Ale chodzi o to, że one maja się same otwierac

pszemek

@TuzZaRogiem nie możesz po prostu olać pierwszego wiersza? Jakiś skiprow czy coś. Ewentualnie z mojego doświadczenia numpy lepiej sobie radzi z wczytywaniem plików.

Zaloguj się aby komentować

100 Days of Python

100 praktycznych zadań do ćwiczenia Pythona.

#technologia #programowanie #python
77a1bcfa-02de-49f9-a98b-721f1cb3dddd
Guma888

Taktyczny wąż na zastaw ćwiczeń Pythona

koszotorobur

@Guma888 - Pytonga trzeba ćwiczyć regularnie!

Guma888

Dla mnie to będzie nauka dopiero.

koszotorobur

@dawid-grabarz - elektryzujący Python

Zaloguj się aby komentować

Poradnik jak dokonać migracja z modułu pytz do modułu zoneinfo:

https://pytz-deprecation-shim.readthedocs.io/en/latest/migration.html

Moduł zoneinfo został dodany do biblioteki standardowej w Pythonie 3.9 - jeśli dalej używasz modułu pytz do obsługi stref czasowych to zalecana jest migracja do zoneinfo.

#technologia #programowanie #python #pytz #zoneinfo
813f06a6-759c-46f6-86f2-2dbe63716d9b

Zaloguj się aby komentować

Catharsis

Yo generalnie to na githubie to prawie do wszystkiego jest takie repo. Wpisujecie interesującą was frazę np język programowania, nazwę systemu, menagera okien itp + "awesome" i macie czasem nawet kilka wyników. Przykłady: awesome-nodejs awesome-kde awesome-hyprland czy najzabawniejsze awesome-awesome-wm (bo jest coś takiego jak awesome-wm xD).

GrindFaterAnona

@Catharsis uuu dzięki

Zaloguj się aby komentować

Krótkie video porady na temat Pythona:

https://www.youtube.com/@b001/shorts

Bo czasami lepiej zobaczyć na własne oczy by zrozumieć

#programowanie #python #tipsandtricks
piotrb

Z takimi sztukami warto uważać bardzo, np. sztuczka przypisania globala do locala fajna, ale promuje złe praktyki.

koszotorobur

@piotrb - ze wszystkimi poradnikami i tutorialami trzeba uważać i patrzeć na nie krytycznie

Niemniej dużo tych porad w tych filmikach to po prostu standardy pythonowe, które nie są oczywiste dla początkujących oraz ludzi przechodzacy z innych języków.

Ja osobiście nie znalazłem źródła 100% poprawnego - prócz może oficjalnej dokumentacji, która jest blisko, ale nie jest jednak skondensowanym źródłem wiedzy do uczenia się "na szybko".

Zaloguj się aby komentować

Jak nauczyć nastolatka Pythona?

Nie szukam teoretycznych informacji bo to sam jestem w stanie sobie znaleźć.

Szukam praktycznych rad i opinii osob które mają doświadczenie w uczeniu programowania młodych osób - nawet jeśli odnieśli porażkę to mogą być w stanie poradzić czego nie robić/unikać.

Hejto pomóż!

#programowanie #python
koszotorobur

@psalek - to wygląda bardzo obiecująco jako zadania domowe - dzięki!

wombatDaiquiri

@koszotorobur to zależy czego chcesz nauczyć.


Przygotowanie do olimpiady informatycznej to jest jakaś opcja i UW ma dużo materiałów na ten temat oraz są dostępne zadanka https://szkopul.edu.pl/p/default/problemset/oi/19


Ja w tym wieku jak się uczyłem sam to chyba najprostsza była logomocja (z żółwiem) bo było widać gdzie się znajduje żółw po odpaleniu programu i co skopałem. Też są jakieś zawody, ale tu byś musiał poszukać.


No chyba że dzban, to mu pokaż Django i niech klepie CRUDy aż mu się znudzi xD

koszotorobur

@wombatDaiquiri - olimpiady to nie koniecznie - to są zwykłe nastolatki bez szczególnych zainteresowań i talentów

Moim celem - i właściwie ich celem bo się na to zgodzili - jest zrozumienie czym tak naprawdę jest programowanie i poznanie Pythona i jego możliwości w takim zakresie, który umożliwi im napisanie prostego programu samodzielnie.

Oni są tak zieloni, że muszę im pokazać jak się Pythona instaluje i jak zainstalować VSC i skonfigurować go pod Pythona - wtedy przejdę do podstaw samego języka.

Cały dzień o tym myślę i już mam plan i proste zadania - może napiszę kiedyś co przygotowałem dla nich i jak uczenie poszło.

wombatDaiquiri

@koszotorobur ja dla takich niezainteresowanych pracuję nad zajęciami mocno korzystającymi z ChatGPT i zakładającymi że już mają dostęp do komputera z profesjonalnym i przygotowanym IDE. Może to jest kierunek? W końcu chyba łatwiej się nauczyć zadawać pytania jak można dostać odpowiedź w chwilę o każdej porze dnia i nocy?

Oscypek

Weż mu apke zainstaluj np Python x albo Mimo

Z resztą sam sobie zainstaluje.

Niech zacznie od prostych rzeczy żeby się nie znirchecił na starcie

Zaloguj się aby komentować

Cython sprawia, że pisanie rozszerzeń C dla Pythona jest tak proste, jak sam Python!

Język Cython jest nadzbiorem języka Python, który dodatkowo obsługuje wywoływanie funkcji C i deklarowanie typów C na zmiennych i atrybutach klas. Dzięki temu kompilator może wygenerować bardzo wydajny kod C z kodu Cythona. Wygenerowany kod C jest następnie kompilowany przy pomocy jednego z dostępnych kompilatorów C/C++ do zoptymalizowanego modułu, który może zostać zaimportowany i użyty przez program napisany w Pythonie.

W skrócie Cython to Python ale z typami danych C - co pozwala mu być jednym z najlepszych i najprostszych narzędzi do przyspieszania programów napisanych w Pythonie!

Przykładowo w Cythonie napisane są moduły Pythona znane ze swojej szybkości jak:


Oficjalny poradnik jak zacząć z Cythonem można zaleźć pod adresem: https://cython.readthedocs.io/en/latest/src/tutorial/cython_tutorial.html

#technologia #programowanie #python #cython
dc103c9b-f99d-48d3-b674-ba7bc1d19ec4
slime-mold

@koszotorobur @rust-n-dust dzięki! dobry kontent

Zaloguj się aby komentować

Kod na uruchamianie funkcji synchronicznych w Pythonie w asynchroniczny sposób:

# Oczywiście warto używać modułów natywnie asynchronicznych od razu jeśli jest to możliwe: https://github.com/timofurrer/awesome-asyncio

import asyncio
import urllib.request

def get_page(url):
‎ ‎ ‎ ‎ with urllib.request.urlopen(url) as f:
‎ ‎ ‎ ‎ ‎ ‎ ‎ ‎ return f.read(100).decode('utf-8') # Zwraca jedynie 100 pierwszych znaków dla zobrazowania jako przykład

async def main():
‎ ‎ ‎ ‎ urls = [' https://www.google.pl' for _ in range(10)] # Ta sama strona 10 razy jako przykład - ale tu należy podać swoją listę stron
‎ ‎ ‎ ‎ tasks =[asyncio.to_thread(get_page, url) for url in urls]
‎ ‎ ‎ ‎ return await asyncio.gather(*tasks)

results = asyncio.run(main())
[print(result) for result in results]

Kod działa jedynie z Pythonem 3.9 lub wyższym.
Dla starszych wersji Pythona można użyć staroszkolnego podejścia z ThreadPoolExecutor lub metody run_in_executor dla loop z modułu asyncio.

#technologia #komputery #programowanie #python
rayros

Brakuje tutaj kolorowania składni :d

koszotorobur

@hejto - @rayros mówi, że brakuje tutaj kolorowania składni .

A brakuje przede wszystkim możliwość umieszczania bloków kodu.

Zaloguj się aby komentować

Następna