Minimera tiden för bildtagning (Python2, RPi3, Camera Module v2)

Trädvy Permalänk
Medlem
Registrerad
Jun 2012

Minimera tiden för bildtagning (Python2, RPi3, Camera Module v2)

Hej!

Jag håller på och bygger en autonom miniatyr-bil för körning på "motorväg", dvs hålla sig inom vägbanan och köra lagom fort. Vi styr allting med en Raspberry Pi 3 som kör Raspbian. Vår mjukvara är programmerad i Python 2 och använder sig av ett antal OpenCV-funktioner för att hitta linjerna. Vårt problem är dock att själva bildtagningen tar över hälften av "cykeltiden" av att läsa av vägbanan (0,07s av totalt 0,12s vid optimala förhållanden).

Har ni kära SweC:are några tips på hur man kan snabba upp processen ytterligare, då kameran ska kunna klara 90 fps videoinspelning vid lägre upplösning? 0,07s motsvarar ca 14 fps (för enbart bildtagningen). Notera att vi helst vill kunna hantera olika ljusförhållanden, men att vi absolut kan tänka oss att anpassa oss för inomhusmiljöer för att kunna förbättra prestandan. Den låga upplösningen räcker för våra senare algoritmer, och gör att de snabbas upp en del.

Nedan följer de kamerainställningarna vi har. Många grejer är ju default-värden, men det känns bäst att ha stenkoll på vad som faktiskt gäller. Framrate:n på 40 verkar ju inte gälla (0,025s), och om vi går över detta beskärs bilden ("inzoomad"), vilket gör att vi bara får ett titthål att läsa av vägbanan genom.

Kamerainställningar:

camera = picamera.PiCamera() # The camera’s default resolution is the display’s resolution. camera.resolution = (205, 154) # 1/32th of max resolution in x and y camera.framerate = 40 camera.sharpness = 0 camera.contrast = 0 camera.brightness = 50 camera.saturation = 0 camera.ISO = 0 camera.exposure_compensation = 0 camera.exposure_mode = 'auto' camera.meter_mode = 'average' camera.awb_mode = 'auto' camera.image_effect = 'none' camera.color_effects = None camera.rotation = 0 camera.hflip = False camera.vflip = False camera.crop = (0.0, 0.0, 1.0, 1.0)

Kodstycke för att ta bilder:

import picamera from picamera.array import PiRGBArray rawCapture = PiRGBArray(camera) camera.capture(rawCapture, format = 'bgr', use_video_port = True) img = rawCapture.array

Tyvärr kryper cykeltiden också iväg ibland (tidvis uppemot 0.3s, även om en liknande mängd linjeinnehåll hittas) - förmodligen på grund av andra processer? Tips där mottages också gärna! Målet är att komma till minst 10 stabila fps, men som det är nu kan vi inte garantera mer än runt 3 fps. Vårt styrsystem sker i en annan tråd genom att spara den beräknade positionen av bilen relativt vägbanan i en global lista.

Intel i5 4670k @ 4,2GHz, 1,106V // Gigabyte Z87-HD3 ATX // Kingston HyperX blu 2x4GB + Fury 2x4GB 1600MHz 10-10-10-27 1,5V // CoolerMaster Hyper 212 EVO // Samsung EVO 840 250GB // NZXT Phantom // Gigabyte 290 4GB // EVGA NEX750G // Windows 10 Pro 64

Trädvy Permalänk
Medlem
Plats
Järnforsen
Registrerad
Mar 2004
Skrivet av LuhcForgh:

Hej!

Jag håller på och bygger en autonom miniatyr-bil för körning på "motorväg", dvs hålla sig inom vägbanan och köra lagom fort. Vi styr allting med en Raspberry Pi 3 som kör Raspbian. Vår mjukvara är programmerad i Python 2 och använder sig av ett antal OpenCV-funktioner för att hitta linjerna. Vårt problem är dock att själva bildtagningen tar över hälften av "cykeltiden" av att läsa av vägbanan (0,07s av totalt 0,12s vid optimala förhållanden).

Har ni kära SweC:are några tips på hur man kan snabba upp processen ytterligare, då kameran ska kunna klara 90 fps videoinspelning vid lägre upplösning? 0,07s motsvarar ca 14 fps (för enbart bildtagningen). Notera att vi helst vill kunna hantera olika ljusförhållanden, men att vi absolut kan tänka oss att anpassa oss för inomhusmiljöer för att kunna förbättra prestandan. Den låga upplösningen räcker för våra senare algoritmer, och gör att de snabbas upp en del.

Nedan följer de kamerainställningarna vi har. Många grejer är ju default-värden, men det känns bäst att ha stenkoll på vad som faktiskt gäller. Framrate:n på 40 verkar ju inte gälla (0,025s), och om vi går över detta beskärs bilden ("inzoomad"), vilket gör att vi bara får ett titthål att läsa av vägbanan genom.

Kamerainställningar:

camera = picamera.PiCamera() # The camera’s default resolution is the display’s resolution. camera.resolution = (205, 154) # 1/32th of max resolution in x and y camera.framerate = 40 camera.sharpness = 0 camera.contrast = 0 camera.brightness = 50 camera.saturation = 0 camera.ISO = 0 camera.exposure_compensation = 0 camera.exposure_mode = 'auto' camera.meter_mode = 'average' camera.awb_mode = 'auto' camera.image_effect = 'none' camera.color_effects = None camera.rotation = 0 camera.hflip = False camera.vflip = False camera.crop = (0.0, 0.0, 1.0, 1.0)

Kodstycke för att ta bilder:

import picamera from picamera.array import PiRGBArray rawCapture = PiRGBArray(camera) camera.capture(rawCapture, format = 'bgr', use_video_port = True) img = rawCapture.array

Tyvärr kryper cykeltiden också iväg ibland (tidvis uppemot 0.3s, även om en liknande mängd linjeinnehåll hittas) - förmodligen på grund av andra processer? Tips där mottages också gärna! Målet är att komma till minst 10 stabila fps, men som det är nu kan vi inte garantera mer än runt 3 fps. Vårt styrsystem sker i en annan tråd genom att spara den beräknade positionen av bilen relativt vägbanan i en global list

Hejsan! Mina egna erfarenheter av OpenCV är rätt så blygsamma, men tänkte tipsa om den här sidan som jag tycker varit rätt så hjälpsam med det mesta. Kanske kan vara till någon hjälp. Skulle vara kul att höra om det funkade bättre i varje fall :).

http://www.pyimagesearch.com/2017/02/06/faster-video-file-fps...

Hårdrockande Datanörds Filosof. Det var nog allt ;)

Trädvy Permalänk
Medlem
Plats
Borås
Registrerad
Okt 2002

Kan tänka mig att automatiska funktioner kan sega ner kameran så blir det någon skillnad om du provar att ställa parametrarna manuellt istället för auto? Om det blir skillnad så kan man labba fram vilken parameter som segar ner det hela mest och kanske köra övriga på auto.

Finns det andra format än "bgr"? Tänkte om någon typ av yuv kan ge mindre mängd data att överföra och så kanske man bara analyserar den svartvita informationen och skippar färginnehållet (y komponenten och struntar i uv).

Verkar gå att fånga YUV:
http://picamera.readthedocs.io/en/release-1.13/recipes2.html#...
Sedan om det är snabbare eller långsammare får ni väl testa.