Nedávno se na twitteru Miro Hrončok ptal jak zveřejňovat fotky z kamery na webu. Na první pohled je to velmi jednoduchá věc. Když se nad tím zamyslíme víc, tak zjistíme, že to tak snadné není.

Je několik způsobů jak toho dosáhnout a současně existuje několik různých variant co to má všechno umět. Jednou z variant je vytvoření streamu. Na to bych doporučil použít nějaký software, který je k tomu určený. Matně se mi vybavuje IceCast, ale nejsem si jistý jestli není určený k něčemu jinému. Podobného cíle se dá dosáhnout i pomocí GStreameru a jeho nástrojů. Za pomocí GStreameru a jeho pluginů je možné udělat vysílat data na UDP pomocí protokolu RTP. S podporou RTSP je to bohužel složitější.

Druhou variantou je ukládat snímek z kamery každou minutu do souboru někam do adresáře /var/www. Tohle se dá rozložit do několika kroků:
– uložení snímku
– periodické ukládání
– ukládání (odesílání) na webový server

Pro periodické volání můžeme použít například cron (každých 10 minut spustit skript saveImage s jménem obrázku jako parametr.

*/10 * * * * /home/imlich/webcam/saveImage /var/www/webcam.jpg

Ukládání na jiný webový server nebudu řešit. Dají se použít programy jako lftp nebo scp.

Nejsložitějším problémem je uložení obrázku do souboru. Opět lze použít gstreamer. Konkrétní příklad volání gstreameru vypadá následovně:

gst-launch-0.10 v4l2src num-buffers=1 device=/dev/video0 ! decodebin ! ffmpegcolorspace! jpegenc ! filesink location=image.jpg

gst-launch je nejspíš v balíčku gst-tools. V parametrech příkazové řádky se potom popíše celý řetězec zpracování:
– jednotlivé položky řetězce jsou odděleny vykřičníkem
– v4l2src je zdroj dat “Video4Linux2”, přičemž chceme jenom jeden snímek a jméno zařízení je /dev/video0
– obrázek se dekóduje (z kamery leze obrázek obvykle v nějakém divném formátu)
– zakódujeme do jpegu
– uložíme do souboru

Další parametry se snaží komponenty zvolit automaticky podle toho jaký vstupní obraz podporují předcházející a navazující komponenty, takže nemusíme vědět jestli z kamery leze obraz ve formátu YUV nebo RGB.

Bohužel se ukázalo, že domluvení se s GStreamerem není úplně snadné a v různých verzích to nemusí všechno úplně hladce fungovat se stejnými parametry.

Protože relativně často používám balíček OpenCV, tak jsem napsal jednoduchý program, který uloží obrázek do souboru. I tenhle program má několik zajímavých míst. OpenCV má jednotné API pro práci s obrazem z kamery a s obrazem ze souboru. Při inicializaci kamery je jako parametr číslo, přičemž -1 by mělo automaticky zvolit první kameru nebo otevřít dialog ve kterém si uživatel zvolí kameru. Číslo 0, 1, 2 potom vybere kameru /dev/video0, /dev/video1, /dev/video2 . Pro firewire kamery se použije hodnota 300.

#include <iostream>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
int main (int argc, char** argv) {
  int sleep = 25;
  char* path = "image.png";
  //  CvCapture* inStream = cvCreateCameraCapture(-1);
  CvCapture* inStream = cvCreateCameraCapture(300);
  if (!inStream) {
    std::cerr << "!cvCreateFromAVI() || !cvCreateCameraCapture(-1)" << std::endl;
    return 1;
  }
  IplImage* inImage = NULL;
  for (int i = sleep; i > 0; i--) {
    if (!cvGrabFrame( inStream )) {
      std::cerr << "!cvGrabFrame(inStream) " << std::endl;
      break;
    }
    inImage = cvRetrieveFrame( inStream );
    if (inImage == NULL) {
      std::cerr << "!cvRetrieveFrame(inStream) " << std::endl;
      break;
    }
  }
  cvSaveImage(path, inImage);
  cvReleaseCapture( &inStream );
  return 0;
}

Dalším zajímavým místem je proměnná sleep. Běžně používané API ke kamerám se snaží být co nejjednodušší a co nejvíc blbovzodrné, takže si řeší nastavení rychlost uzávěrky, ostření a asi pár dalších věcí sami. Než se tyhle hodnoty ustálí tak to chvilku trvá, takže je rozumné aspoň sekundu počkat.

Zajímavostí je že API pro ovládání ostření kamery, uzávěrky nebo dokonce blesku by měli být v budoucnu dostupné. Na kernel sumitu v Praze bylo na toto téma několik přednášek. Konkrétně se jednalo o projekt Media Controller (který tyhle vlastnosti už teď umožňuje na N9).

Co je na tomto programu nepříjemné, že si obsadí kameru, takže pravděpodobně nebude fungovat v programech jako je skype. Další nepříjemností je, že tyhle API (GStreamer, v4l2, atd.) jsou poměrně živé a často se mění. To má za následek, že na poslední fedoře mi ukládal obrázky i GStreamer i program v OpenCV, ale na Debianu Sqeeze nefungovalo ani jedno.

Loading

By Jozef Mlích

Software Developer at GreyCortex, NemoMobile contributor, Micro light aircraft pilot, OpenAlt Conference organizer

29 thoughts on “Webcam”
  1. Kdysi jsem používal prográmek zvaný motion. Má sice poměrně složitou konfiguraci, ale za to umí i pár triků navíc. Nejen že lze snímat obrázky v pravidelných intervalech, ale umí i začít fotit ve chvíli kdy se v zorném poli něco pohne, zvýrazňovat v obrázcích oblasti kde pohyb nastal nebo třeba vkládat do obrázku datum. Zároveň jde jednoduše nastavit streamování, takže odpadají starosti se serverem :)

  2. Koukam spatne nebo je v main() je treti radek kdy ziskavate handler na kameru zakomentovany?

  3. Koukam spatne nebo je v main() je treti radek kdy ziskavate handler na kameru zakomentovany?

  4. [2] Pokud nebudete fotit sousedův pozemek, ale jen veřejné prostranství, tak si nikdo stěžovat nebude… a kdy náhodou jo, tak prostě děláte časosběrné video, to se jinak udělat nedá. :D

    [3] Taky mi to přijde divné… :)

  5. [2] Pokud nebudete fotit sousedův pozemek, ale jen veřejné prostranství, tak si nikdo stěžovat nebude… a kdy náhodou jo, tak prostě děláte časosběrné video, to se jinak udělat nedá. :D

    [3] Taky mi to přijde divné… :)

  6. [4] tim bych si nebyl tak uplne jisty, nedavno urad pro ochranu osobnich informaci pokutoval cloveka za to, ze natacel na kameru sve auto stojici pred jeho domem a nasledne zverejnil na facebooku zaznam vykradeni tohoto auta.

    Viz napr.:

    http://zpravy.ihned.cz/c1-55608390-novinare-terorizovali-kvuli-praci-kdyz-si-je-nahral-na-video-dostal-sam-trest
    http://www.novinky.cz/internet-a-pc/265604-za-zverejneni-fotky-zlodeje-na-facebooku-dostal-obchod-pokutu.html
    http://zpravy.idnes.cz/nemec-o-sledovani-kamerami-musime-vedet-ty-policejni-vsak-maji-vyjimku-1m1-/domaci.aspx?c=A080515_101355_domaci_hos

  7. [4] tim bych si nebyl tak uplne jisty, nedavno urad pro ochranu osobnich informaci pokutoval cloveka za to, ze natacel na kameru sve auto stojici pred jeho domem a nasledne zverejnil na facebooku zaznam vykradeni tohoto auta.

    Viz napr.:

    http://zpravy.ihned.cz/c1-55608390-novinare-terorizovali-kvuli-praci-kdyz-si-je-nahral-na-video-dostal-sam-trest
    http://www.novinky.cz/internet-a-pc/265604-za-zverejneni-fotky-zlodeje-na-facebooku-dostal-obchod-pokutu.html
    http://zpravy.idnes.cz/nemec-o-sledovani-kamerami-musime-vedet-ty-policejni-vsak-maji-vyjimku-1m1-/domaci.aspx?c=A080515_101355_domaci_hos

  8. [4] a [2]:
    Pokud bude kamera pouze snimat a tyto data nebudou nikde ukladana, tak by to problem byt nemel. Jestli ale budete porizovat snimky a ty dale ukladat (archivovat), budete potrebovat zvlastni povoleni od UOOU. Jestlize je to obycejna webkamera, ktera bude vysoko a nebude poskytovat detaily o lidech na verejnych prostranstvich, je to sporne – v kazdem pripade by ale mel byt prostor sledovany kamerou vyznacen tak, aby bylo jasne, ze prochazejici osoby jsou zaznamenavany.
    Na soukromem pozemku a u sebe doma si lze nahravat, jak je libo.
    UOOU reaguje na podnety, takze bych to nepodcenoval. Samozrejme kde neni zalobce, neni soudce. Ja osobne se dobrovolne nahravat nenecham – nechapu, co je komu do toho, kdo chodi na chodniku pred jeho domem. Kdyz ho to tak zajima, necht se posadi k oknu a muze to sledovat cely den.

  9. [4] a [2]:
    Pokud bude kamera pouze snimat a tyto data nebudou nikde ukladana, tak by to problem byt nemel. Jestli ale budete porizovat snimky a ty dale ukladat (archivovat), budete potrebovat zvlastni povoleni od UOOU. Jestlize je to obycejna webkamera, ktera bude vysoko a nebude poskytovat detaily o lidech na verejnych prostranstvich, je to sporne – v kazdem pripade by ale mel byt prostor sledovany kamerou vyznacen tak, aby bylo jasne, ze prochazejici osoby jsou zaznamenavany.
    Na soukromem pozemku a u sebe doma si lze nahravat, jak je libo.
    UOOU reaguje na podnety, takze bych to nepodcenoval. Samozrejme kde neni zalobce, neni soudce. Ja osobne se dobrovolne nahravat nenecham – nechapu, co je komu do toho, kdo chodi na chodniku pred jeho domem. Kdyz ho to tak zajima, necht se posadi k oknu a muze to sledovat cely den.

  10. [2] pokud na snímcích nepůjde identifikovat žádné osoby tak je to bez problému. Jinak konzultujte s UOOU – a to ať už natáčíte veřejné prostranství nebo soukromé prostory, zásadní problém je v tom že zveřejňujete záznam.

  11. [2] pokud na snímcích nepůjde identifikovat žádné osoby tak je to bez problému. Jinak konzultujte s UOOU – a to ať už natáčíte veřejné prostranství nebo soukromé prostory, zásadní problém je v tom že zveřejňujete záznam.

  12. ja mám na streche už nejakú dobu kamerku 320*240 na snímanie ulice a teplomer s DB18S20 a na web odosielam fotku a teplotu, po prečítaní komentárov radšej nebudem zobrazovať záznam :D pozerám, že podla automobilov susedov sa dá presne sledovať kedy boli doma a kedy nie :D

  13. ja mám na streche už nejakú dobu kamerku 320*240 na snímanie ulice a teplomer s DB18S20 a na web odosielam fotku a teplotu, po prečítaní komentárov radšej nebudem zobrazovať záznam :D pozerám, že podla automobilov susedov sa dá presne sledovať kedy boli doma a kedy nie :D

  14. Kamer na sledovani pocasi porad pribyva. Lidi jsou videt jen obcas na nekterych kamerach, ale u nekterych kamer jde sledovat kdy se v jakym okne sviti, v zornym poli nekdy i panelaky s velkym poctem okem. Aktualizace kazdych 5 min. U nekterych kamer by to chtelo rozmazat cast zorneo pole nebo zmeit smer vyhledu.

  15. Kamer na sledovani pocasi porad pribyva. Lidi jsou videt jen obcas na nekterych kamerach, ale u nekterych kamer jde sledovat kdy se v jakym okne sviti, v zornym poli nekdy i panelaky s velkym poctem okem. Aktualizace kazdych 5 min. U nekterych kamer by to chtelo rozmazat cast zorneo pole nebo zmeit smer vyhledu.

  16. Naposledy kdyz jsem pouzival opencv tak jsem vsechny funkce na grabovani snimku odstranil a napsal si je sam. Je to i tim ze nektery drivery v linuxu nefungujou uplne idealne. Jinak zde bych fakt na opencv nesahal a proste bych udelal open/read/close na /dev/video0 a data preved na neco pouzitelnyho (rgb), mozna jedine pouzil OpenCV cvSaveImage nad rgb matici (ale na to jsou i jine funkce).

  17. Naposledy kdyz jsem pouzival opencv tak jsem vsechny funkce na grabovani snimku odstranil a napsal si je sam. Je to i tim ze nektery drivery v linuxu nefungujou uplne idealne. Jinak zde bych fakt na opencv nesahal a proste bych udelal open/read/close na /dev/video0 a data preved na neco pouzitelnyho (rgb), mozna jedine pouzil OpenCV cvSaveImage nad rgb matici (ale na to jsou i jine funkce).

  18. [10] ano, podobneho software je plno – sahl jsem po tom ktery znam.
    [12] ano, i to by slo.
    [13] ano, pochybne drivery kamer muzou byt problem. Reseni je samozrejme vic. Jsem rad za kazdy postreh, jestli mas napsany program, tak ho posli..

  19. [10] ano, podobneho software je plno – sahl jsem po tom ktery znam.
    [12] ano, i to by slo.
    [13] ano, pochybne drivery kamer muzou byt problem. Reseni je samozrejme vic. Jsem rad za kazdy postreh, jestli mas napsany program, tak ho posli..

Comments are closed.