Visualizzare immagini da buffer

di il
11 risposte

Visualizzare immagini da buffer

Buongiorno, sono alle prime armi, ma devo per forza cimentarmi in un doppio tuffo in avanti carpiato. Ho la necessità di portare sullo schermo, all' interno di un form di una applicazione C++, l'immagine catturata da una telecamera, i cui frames sono già in un buffer di memoria.
La semplice applicazione console che mi ha dato il fornitore della telecamera gira, nel senso che la telecamera risponde corettamente e mi vengono segnalati i frames acquisiti senza errori.
Qualche buon anima mi saprebbe dare qualche indicazione? Grazie in anticipo. Luca

11 Risposte

  • Re: Visualizzare immagini da buffer

    Piuttosto difficile senza altri dettagli ...

    Formato dei dati nel buffer ... contesto software in cui operi ..
  • Re: Visualizzare immagini da buffer

    Ciao, grazie x l'interessamento.
    Sto lavorando con VS 2010, il formato dati delle immagini è Y14 ( ma le immagini sono in realtà B/W ), 1024 x 1024 pixels
  • Re: Visualizzare immagini da buffer

    Scusate: ma secondo me c'e' qualcosa che non funziona.

    Un buffer in memoria e' un blocco di memoria che appartiene ad un processo, ed al suo range di indirizzi.

    Ora, far si che un'altro processo possa accedere ad un'aria di memoria del primo processo e' una questione complicata:

    1) per essere possibile, e' possibile: il primo processo deve creare un handler Windows globale che punta all'area di memoria, ed il secondo processo accede a quel handler globale.

    2) altrimenti, e' maledettamente complicato, tendenzialmente impossibile (se non utilizzando tecniche di hacking, mooooolto complesse che richiedono reverse engineering del primo programma, analisi del codice, capire come arrivare al buffer navingandi tra stack, puntatori globali, ....).

    Il fatto che si lavori in VS2010 e che le immagini siano in formato Y14 (formato proprietario o sbagliato, visto che non ne ho trovate le specifiche) e' un'informazione inutile.

    Sei sicuro che l'applicazione non generi un file video in un formato standard a cui puoi successivamente accedere?

    Oppure spiegati meglio.
  • Re: Visualizzare immagini da buffer

    Se non ho capito male nel programma dell'utente sono richiamate delle API del produttore che mette a disposizione tramite una libreria (e quindi il buffer è creato a partire da quelle API).
    Non c'è un programma esterno.
  • Re: Visualizzare immagini da buffer

    La telecamera usa lo standard GigE ( è fornita di driver che - meno male - funziona)
    Vi allego il sorgente che mi ha mandato il costruttore.


    #include <stdio.h>
    #include <SDK4AcquireApi.h>
    #include <SDK4ControlTypes.h>
    #include <SDK4H3XRApi.h>

    #include <vector>
    #include <iostream>
    #include <string.h>
    using namespace std;

    #define _CHECK(f) {SDK4_ERROR err=(f);if(SDK4_ERR_SUCCESS!=err){cerr<< #f <<" failed: "<<err<<endl;goto Exit;}}

    int main()
    {
    bool bOpen=false;
    int choice;

    static char sModel[256];
    int32_t sizeModel=sizeof(sModel);

    char sClassId[256];
    int32_t sizeClassId=sizeof(sClassId);

    vector<string> devnames;
    int32_t numDevices=0;

    BUFFER_HANDLE hBuffer[5];
    uint32_t uPayloadSize=0;

    //image parms
    int32_t width=0;
    int32_t height=0;
    ENUM_PIXELFORMAT format=0;

    //Stat
    int nComplete=0;
    int nIncomplete=0;
    int nTimedOut=0;


    cout << "[SDK4 Acquire SLX CAT] " << endl ;

    _CHECK(SDK4InitLib());
    _CHECK(SDK4GetNumDevices(&numDevices));

    cout << endl << "Select camera device:" << endl << endl;

    for(uint32_t i = 0; i < numDevices; i++)
    {
    char sName[256];
    int32_t sizeName=sizeof(sName);
    _CHECK(SDK4GetDeviceID(i,sName,&sizeName));
    cout << "[" << i+1 << "] " << sName << endl;
    devnames.push_back(sName);
    }
    cout << endl << "[0 to quit] =>";
    cin >> choice; if(!choice) goto Exit;

    DEV_HANDLE hDev;
    DS_HANDLE hDataStream;

    _CHECK(SDK4OpenDevice(devnames[choice-1].c_str(),DEVICEACCESS_EXCLUSIVE,&hDev));
    //Device
    _CHECK(SDK4DevGetClassID(hDev,sClassId,&sizeClassId));
    _CHECK(SDK4DevGetModel(hDev,sModel,&sizeModel));
    _CHECK(SDK4DevGetDataStream(hDev,&hDataStream));
    //DataStream
    _CHECK(SDK4DSGetWidth(hDataStream,&width));
    _CHECK(SDK4DSGetHeight(hDataStream,&height));
    _CHECK(SDK4DSGetPixelFormat(hDataStream,&format));
    _CHECK(SDK4DSGetPayloadSize(hDataStream,&uPayloadSize));

    cout << endl;
    cout << "ClassID = " << sClassId << endl;
    cout << "Model = " << sModel << endl;
    cout << endl;
    cout << "Width = " << dec << width << endl;
    cout << "Height = " << dec << height << endl;
    cout << "Format = " << hex << format << endl ;
    cout << "PayloadSize = " << dec << uPayloadSize << endl<< endl;

    for(int i=0;i<5;i++)
    {
    _CHECK(SDK4DSAllocAndAnnounceBuffer(hDataStream,uPayloadSize,NULL,&hBuffer));
    _CHECK(SDK4DSQueueBuffer(hDataStream,hBuffer));
    }
    _CHECK(SDK4DevStartAcquisition(hDev));

    for(int n=0;n<100;n++)
    {
    BUFFER_HANDLE hTempBuffer;
    void* pBuffer;
    uint32_t size;
    int32_t bComplete;

    SDK4_ERROR err=SDK4DSWaitForBuffer(hDataStream,&hTempBuffer,500);
    switch(err)
    {
    case SDK4_ERR_SUCCESS:
    _CHECK(SDK4BufferGetPtr(hTempBuffer,&pBuffer));
    _CHECK(SDK4BufferGetSize(hTempBuffer,&size));
    _CHECK(SDK4BufferIsComplete(hTempBuffer,&bComplete));
    if(bComplete)
    {
    nComplete++;
    }
    else
    {
    nIncomplete++;
    }
    //DoWork ...
    //Queue Buffer again
    _CHECK(SDK4DSQueueBuffer(hDataStream,hTempBuffer));
    break;
    case SDK4_ERR_TIMEOUT:
    nTimedOut++;
    break;
    default:
    break;
    }
    }
    _CHECK(SDK4DevStopAcquisition(hDev));

    std::cout << "Frames acquisiti: Completi="<<nComplete << " Incompleti="<<nIncomplete << " TimedOut="<< nTimedOut << std::endl;

    _CHECK(SDK4DSFlushQueue(hDataStream));
    for(int i=0;i<5;i++)
    {
    _CHECK(SDK4DSRevokeBuffer(hDataStream,hBuffer,NULL,NULL));
    }
    _CHECK(SDK4CloseDevice(hDev));

    Exit:
    _CHECK(SDK4CloseLib());

    return 0;
    }
  • Re: Visualizzare immagini da buffer

    Usa i tag CODE per il codice altrimenti si legge male ... e indica di quale buffer parli ...
  • Re: Visualizzare immagini da buffer

    Sì scusami.... questo:

    
    
    //DoWork ...
    //Queue Buffer again
    _CHECK(SDK4DSQueueBuffer(hDataStream,hTempBuffer));
        break;
             case SDK4_ERR_TIMEOUT:
                  nTimedOut++;
        break;
       default:
    break;
    }
    }
    
    
  • Re: Visualizzare immagini da buffer

    oregon ha scritto:


    Se non ho capito male nel programma dell'utente sono richiamate delle API del produttore che mette a disposizione tramite una libreria (e quindi il buffer è creato a partire da quelle API).
    Non c'è un programma esterno.
    Allora si che c'azzecca
  • Re: Visualizzare immagini da buffer

    Vai a leggerti la "CreateDIBSection"
    Poi nella maniera piu semplice copi pixel per pixel dentro al nuovo buffer poi lo visualizzi sul dispositivo tramite ad esempio la stretchdibits.
    Anche se molto probabilmente con un pò di fortuna puoi creare direttamente la sezione tramite il buffer che hai già in memoria.
  • Re: Visualizzare immagini da buffer

    Grazie a tutti, non so se copiare pixel per pixel possa essere fattibile, lo stream delle immagini mi arriva a 30 fps, e devo viualizzarli "live" sul monitor. Sono ancora in alto mare, purtroppo....
  • Re: Visualizzare immagini da buffer

    Le api DIBits permettono di settare un buffer esterno,basta che contengono solo il valore del pixel, ovvero se tu hai un buffer e per ogni posizione del buffer corrisponda un valore di pixel allora la dib ti permette di usarlo.
    Il buffer può essere lineare o bidimensionale,può essere 0/1 o a 32bit.
    Quindi devi imparare a usare le api per accettare il tuo buffer e visualizzarlo a video.
    Se lo devi elaborare e farci altri "marchingegni" allora molto probabilmente qualche frame lo perdi(il tutto dipende da cosa e da che microprocessore hai).

    Ti consiglio di creare un nuovo progetto e farti le ossa sulle api sopra citate.
Devi accedere o registrarti per scrivere nel forum
11 risposte