2012-01-14 15 views
6

Ho letto molti, molti thread sulle immagini in streaming su IP in OpenCV 2.3.1, ma non riesco ancora a far funzionare il mio programma.c, opencv - accesso alla videocamera JPG image over ip

Ho scaricato IP Webcam per Android da https://market.android.com/details?id=com.pas.webcam&hl=en e recentemente ho imparato OpenCV per recuperare le immagini dalla fotocamera del mio telefono Android.

Il relativo manuale incorporato ha detto che l'immagine dalla fotocamera del telefono può essere localizzata a http://the.phone.ip.address:8080/shot.jpg. L'ho aperto dal browser più volte e sembra sempre a posto. Ho anche creato OpenCV manualmente, con il supporto FFmpeg.

Finora ho provato

CvCapture* webcam = cvCaptureFromFile("http://192.168.1.220:8080/shot.jpg"); 

ma restituisce NULL e uscite

[image2 @ 0xd701e0]Could not find codec parameters (Video: mjpeg, yuv420p) 

Ho anche provato a sostituire http con RTSP, ma ancora non funziona. Ho anche provato a sostituire l'url con qualche altro URL di immagine (un collegamento diretto a un'immagine casuale di Google Immagini e uno da localhost) e uccide sempre con un segfault.

Ecco la mia sorgente completo

#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
#include <cv.h> 
#include <highgui.h> 

int main(int argc, char* argv[]) 
{ 
    CvCapture* webcam = cvCaptureFromFile("http://192.168.1.220:8080/shot.jpg"); 
    if(!webcam) 
    { 
     fprintf(stderr, "cannot open webcam\n"); 
     return 1; 
    } 

    IplImage* img = cvQueryFrame(webcam); 
    if(!img) 
    { 
     fprintf(stderr, "cannot get image\n"); 
     return 1; 
    } 

    cvNamedWindow("test", CV_WINDOW_AUTOSIZE); 
    cvShowImage("test", img); 
    cvWaitKey(0); 
    cvReleaseImage(&img); 
    /**/ cvReleaseCapture(&webcam); /**/ 
    cvDestroyWindow("test"); 
    return 0; 
} 

OpenCV può davvero leggere le immagini su IP, o mi sto perdendo qualcosa?

+0

hai ricevuto la risposta? – wolvorinePk

+0

Ho provato 'rtsp: //192.168.1.104: 8080/videofeed' ma non sono riuscito. – krzych

risposta

2

Mentre sarebbe/fantastico/se è stato supportato, non sembra essere. Nota che i sistemi operativi gestiscono l'apertura dei file in modo diverso dagli URL (ovviamente), quindi non è qualcosa che sarebbe supportato di default - non puoi creare un URL fopen(). Se OpenCV specificatamente lo supportano, sarebbe possibile, ma ho qualche prova che non è così:

Ecco cosa si può fare:

  • Scarica l'immagine in qualche altro modo - magari utilizzando una chiamata system() a wget, magari utilizzando una libreria per scaricare il file in memoria
  • Almeno una fonte dice che è possibile utilizzare Processing's loadImage() per caricare da un URL.
+0

Allora perché riconosce che il suo mjpeg e in qualche formato particolare? Ho offerto la causa boundy voluto estendere questa domanda accedendo a questa applicazione videofeed in qualsiasi modo possibile. Ma la mia modifica alla domanda è stata respinta. Quindi OpenCV quando compilato con ffmpeg dovrebbe far fronte alla videofeed di questa app. – krzych

+0

Questo è sorprendente. Potrebbe essere solo un default, perché tutto quello che ho letto suggerisce che OpenCV non è in grado di gestire la lettura da internet. Mentre dubito che risolverebbe il tuo problema, non dovresti usare [VideoCapture] (http://opencv.willowgarage.com/documentation/cpp/reading_and_writing_images_and_video.html#videocapture) per leggere un video? – Dan

+0

Talvolta la lettura non è sufficiente. Non voglio spiegare come è fatto in OpenCV ma puoi vederlo alla fonte. So che dovrebbe essere possibile, ma non so abbastanza per farlo funzionare. Personalmente non mi piacciono le risposte fatte solo su google di qualcosa e sulla presentazione dei risultati. Soprattutto quando la domanda è come quella – krzych

4

Io non sono specificamente familiarità con OpenCV, ma dopo aver passato un minuto a guardare i documenti, due cose saltano fuori di me: -

Prima di tutto, vi trovate ad Non si tratta di un flusso video vero qui: la tua app Android rende disponibile l'attuale acquisizione JPEG e devi continuamente ricopiarla. Perché è un'immagine, non un video, dovresti usare invece cvLoadImage().

In secondo luogo, si passa un URL, non un nome file.Avrai bisogno di un modo per usare HTTP per recuperare l'immagine in un file locale prima di provare ad aprirlo con openCV.

Suggerirei di salvare un'istantanea del file JPEG localmente dal browser e quindi provare a far funzionare il codice con quello. Una volta che hai funzionato da un file locale, prova ad aggiungere il materiale di recupero HTTP.

+0

E cosa con videostream fornito con l'app. Ci sono alcune domande per esempio questo http://stackoverflow.com/questions/712998/opencv-with-network-cameras che spiega il suo possibile. – krzych

0

Ulteriori ricerche sulla risposta di Roddy fanno sì che le cose funzionino per me.

Purtroppo non è bello e l'unica soluzione di Windows. Ma l'unico modo per ottenere jpg da questa applicazione è di recuperare http in qualche modo. Ci sono molte librerie che possono aiutare per esempio libcurl, boost :: asio. Ho usato urlmon.lib per far funzionare le cose per me:

#inlcude <opencv2\opencv.hpp> 
#include <UrlMon.h> 
#include <tchar.h> 
#pragma comment(lib,"urlmon.lib") 

int main() 
{ 
     for(;;) 
     { 
       HRESULT hr = URLDownloadToFile(NULL,_T("http://192.168.1.104:8080/shot.jpg"), 
              _T("D:/test.jpg"),0,NULL); 
       IplImage *test = cvLoadImage("D:/test.jpg"); 
       cvShowImage("test",test); 
       cvWaitKey(30); 
     } 
} 

Questa applicazione consente anche lo streaming mjpg come ho suggerito nei commenti. OpenCV VideoStream sembra avere la possibilità di leggere da esso come suggerito Stream live video in openCv from localHost port (http://192.168.1.1:8080) e OpenCV with Network Cameras. Ho provato anche questa soluzione ma ottengo mp3 header missing. Spero che qualcuno fornisca una risposta con l'utilizzo di videofeed da questa applicazione.