Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить image от Web-камеры 
:(
    Опции темы
Sphinx
Дата 20.7.2006, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Привет всем!

Вот такая проблемка: есть web-камера Dlink DCS-900. У нее есть transfer image port.
Хочется из своей программы через этот порт получать картинки. Но для этого надо знать протокол общения с ней (какие команды и в каком виде посылать) и, наверное, надо для начала проинициализироваться. Может у кого есть опыт общения с подобными устройствами? 

При поключении к этому порту получаю 130 байтный ответ:
00:  30 33 30 31 16 2D 17 80 ¦ A2 E5 02 D0 68 B9 00 F4   0301-Авх-h¦
10:  8B 96 0B 40 2D 17 80 7E ¦ 45 CB 05 A0 B4 5C 00 FA   ЛЦ @-А~E-а¦\
20:  D1 72 01 E8 96 0B 40 3F ¦ 72 01 E8 47 5C 00 FA 51   -rшЦ @?rшG\ ·
30:  CB 05 A0 1F 0B 40 3F CA ¦ E5 02 D0 8F 2E 00 FD 28   -а @?-х-П. ¤
40:  B9 00 F4 A3 05 A0 1F E5 ¦ 00 F4 A3 BC 02 D0 8F F2   ¦ Їгах Їг+-П
50:  01 E8 47 79 00 00 00 00 ¦ 00 00 00 00 00 00 00 00   шGy
60:  00 00 00 00 00 00 00 00 ¦ 00 00 00 00 00 00 00 00
70:  00 00 00 00 00 00 00 00 ¦ 00 00 00 00 00 00 00 00
80:  00 00                   ¦
 
PM MAIL   Вверх
MoZy
Дата 20.7.2006, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 4.6.2006

Репутация: -2
Всего: 0



Sphinx, с бодобным нет, но поюзай MCI - там даже с VHS катит. 
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
Sphinx
Дата 21.7.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Цитата(MoZy @  20.7.2006,  20:03 Найти цитируемый пост)
но поюзай MCI - там даже с VHS катит.  

А что это такое - MCI? Компанию знаю... 
PM MAIL   Вверх
MoZy
Дата 21.7.2006, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 4.6.2006

Репутация: -2
Всего: 0



Найди учебник по АПИ. Раздел мультимедиа. 
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
Sphinx
Дата 21.7.2006, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Цитата(MoZy @ 21.7.2006,  18:36)
Найди учебник по АПИ. Раздел мультимедиа.

Если не сложно, какой-нибудь рабочий примерчик, пожалуйста. 
PM MAIL   Вверх
MoZy
Дата 21.7.2006, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 4.6.2006

Репутация: -2
Всего: 0



я только с аудио "работал".
Код

case WM_COMMAND:
            
 if( (HWND)lParam == bRecord )
    {
        if(rec==false)//запись еще не началась
        {

            mciOpenParms.lpstrDeviceType = "waveaudio";
            mciOpenParms.lpstrElementName="";

            if (mciSendCommand(0,MCI_OPEN,MCI_WAIT|MCI_OPEN_TYPE|MCI_OPEN_ELEMENT, 
                (DWORD)(LPVOID) &mciOpenParms))
            {
                // ; don't close it, just return error.
                debug("Failed to open device");
                break;
            }
            
            wDeviceID = mciOpenParms.wDeviceID;

            // The device opened successfully; get the device ID.
    
            MCI_WAVE_SET_PARMS lpSet;
            int herz,bits,ch,block;
            
            herz=44100;

            bits=16;

            ch=2;
            
            block=ch*(bits/8);
            
            lpSet.nChannels = ch;
            lpSet.nSamplesPerSec = herz;
            lpSet.nAvgBytesPerSec = herz*block;
            lpSet.nBlockAlign = block;
            lpSet.wBitsPerSample = bits; 
            
            mciSendCommand(
                wDeviceID,
                MCI_SET,
                MCI_WAVE_SET_BITSPERSAMPLE|
                MCI_WAVE_SET_CHANNELS|
                MCI_WAVE_SET_SAMPLESPERSEC|
                MCI_WAVE_SET_BLOCKALIGN|
                MCI_WAVE_SET_AVGBYTESPERSEC,
                (DWORD) (LPMCI_WAVE_SET_PARMS*) &lpSet
            );
    
            // Begin recording

            mciRecordParms.dwFrom = 0L;//запись с нулевой позиции
       
            if (mciSendCommand(wDeviceID, MCI_RECORD,MCI_FROM, (DWORD)(LPVOID) &mciRecordParms))
            {
                mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
                break;
            }

            rec=true;
                
            break;
        }
        else//если запись уже идет
        {

            rec=false;
            
            mciSendCommand(wDeviceID, MCI_PAUSE,MCI_WAIT,(DWORD)(LPVOID) &lpPause);
            
            if( MessageBox(0,"Сохранить запись?","Записано",
                        MB_YESNO|MB_TOPMOST)==IDYES )
            { 
                GetLocalTime(&clTime);//берем системное время (то что на компе, а не в Гринвиче ))
                sprintf(st,"%s\\record(%d-%d-%d).wav",dir,clTime.wHour,clTime.wMinute,clTime.wSecond); 

                mciSaveParms.lpfilename = st;
                mciSendCommand(wDeviceID, MCI_SAVE,MCI_SAVE_FILE|MCI_WAIT, (DWORD)(LPVOID) &mciSaveParms);
            }
            mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
            break;
        }
    }
 
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
0x00
Дата 22.7.2006, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 3.4.2006

Репутация: нет
Всего: нет



слух, я встречал такие ф-ции  в программе bo2k. вроде в загаловке VfW.H есть ф-ции для работы с видеоаппаратурой...
пролистай все видео девайсы выбери нужный и получи от него картинку, если интересно, могу скинуть на e-mail.

вот так пролистать девайсы..

Код

                for (int i=0;i<10;i++) {
                    if(capGetDriverDescription(i, svName, 255, svComment, 511)) {
                        wsprintf(buffer, "Capture driver #%d - %s - %s.\r\n", i, svName, svComment);
                    }
                }


Код

bool Capture(char *file)
{
    HDC hdc;
    HBITMAP bitmap;
    BITMAPINFO bmpinfo;
    LPVOID pBits;
    HDC hdc2;
    DWORD dwWidth, dwHeight, dwBPP, dwNumColors;
    HGDIOBJ gdiobj;
    HANDLE hfile;
    DWORD dwBytes;    

    hdc=CreateDC("DISPLAY", NULL, NULL, NULL);
    if(hdc==NULL) {
        return FALSE;
    }
    dwWidth = GetDeviceCaps(hdc, HORZRES);
    dwHeight = GetDeviceCaps(hdc, VERTRES);
    dwBPP = GetDeviceCaps(hdc, BITSPIXEL);
    if(dwBPP<=8) {
        dwNumColors = GetDeviceCaps(hdc, NUMCOLORS);
        dwNumColors = 256;
    } else {
        dwNumColors = 0;
    }
    hdc2=CreateCompatibleDC(hdc);
    if(hdc2==NULL) {
        DeleteDC(hdc);
        return FALSE;
    }
    bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpinfo.bmiHeader.biWidth = dwWidth;
    bmpinfo.bmiHeader.biHeight = dwHeight;
    bmpinfo.bmiHeader.biPlanes = 1;
    bmpinfo.bmiHeader.biBitCount = (WORD) dwBPP;
    bmpinfo.bmiHeader.biCompression = BI_RGB;
    bmpinfo.bmiHeader.biSizeImage = 0;
    bmpinfo.bmiHeader.biXPelsPerMeter = 0;
    bmpinfo.bmiHeader.biYPelsPerMeter = 0;
    bmpinfo.bmiHeader.biClrUsed = dwNumColors;
    bmpinfo.bmiHeader.biClrImportant = dwNumColors;
    bitmap = CreateDIBSection(hdc, &bmpinfo, DIB_PAL_COLORS, &pBits, NULL, 0);
    if(bitmap==NULL) {
        DeleteDC(hdc);
        DeleteDC(hdc2);
        return FALSE;
    }
    gdiobj = SelectObject(hdc2, (HGDIOBJ)bitmap);
    if((gdiobj==NULL) || (gdiobj==(void *)GDI_ERROR)) {
        DeleteDC(hdc);
        DeleteDC(hdc2);
        return FALSE;
    }
    if (!BitBlt(hdc2, 0,0, dwWidth, dwHeight, hdc, 0,0, SRCCOPY)) {
        DeleteDC(hdc);
        DeleteDC(hdc2);
        return FALSE;
    }    
    RGBQUAD colors[256];
    if(dwNumColors!=0) {
        dwNumColors = GetDIBColorTable(hdc2, 0, dwNumColors, colors);
    }    
    BITMAPFILEHEADER bitmapfileheader;
    BITMAPINFOHEADER bitmapinfoheader;
    bitmapfileheader.bfType = 0x4D42;
    bitmapfileheader.bfSize = ((dwWidth * dwHeight * dwBPP)/8) + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (dwNumColors * sizeof(RGBQUAD));
    bitmapfileheader.bfReserved1 = 0;
    bitmapfileheader.bfReserved2 = 0;
    bitmapfileheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (dwNumColors * sizeof(RGBQUAD));  
    bitmapinfoheader.biSize = sizeof(BITMAPINFOHEADER);
    bitmapinfoheader.biWidth = dwWidth;
    bitmapinfoheader.biHeight = dwHeight;
    bitmapinfoheader.biPlanes = 1;
    bitmapinfoheader.biBitCount = (WORD)dwBPP;
    bitmapinfoheader.biCompression = BI_RGB;
    bitmapinfoheader.biSizeImage = 0;
    bitmapinfoheader.biXPelsPerMeter = 0;
    bitmapinfoheader.biYPelsPerMeter = 0;
    bitmapinfoheader.biClrUsed = dwNumColors;
    bitmapinfoheader.biClrImportant = 0;    
    hfile=CreateFile(file,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hfile==INVALID_HANDLE_VALUE) {
        DeleteObject(bitmap);
        DeleteDC(hdc2);
        DeleteDC(hdc);
        return FALSE;
    }
    WriteFile(hfile,&bitmapfileheader,sizeof(BITMAPFILEHEADER), &dwBytes, NULL);
    WriteFile(hfile,&bitmapinfoheader,sizeof(BITMAPINFOHEADER), &dwBytes, NULL);
    if(dwNumColors!=0)
        WriteFile(hfile,colors,sizeof(RGBQUAD)*dwNumColors,&dwBytes,NULL);
    WriteFile(hfile,pBits,(dwWidth*dwHeight*dwBPP)/8,&dwBytes,NULL);
    CloseHandle(hfile);        
    DeleteObject(bitmap);
    DeleteDC(hdc2);
    DeleteDC(hdc);
    return TRUE;
}


Код

int CaptureFrame(char *file, int index, int x, int y)
{
    char svBuffer[1024];
    HWND hwndCap;

    hwndCap=capCreateCaptureWindow("Window", WS_CHILD, 0, 0, 160, 120, Window, 1);
    if(hwndCap==NULL) {
        return 1;
    }
    if(capDriverConnect(hwndCap, index)==FALSE) {
        DestroyWindow(hwndCap);
        return 1;    
    }
    CAPDRIVERCAPS pcdc;
    capDriverGetCaps(hwndCap, &pcdc, sizeof(CAPDRIVERCAPS));
    if(!pcdc.fCaptureInitialized) {
        DestroyWindow(hwndCap);
        return 1;
    }
    DWORD dwSize;
    BITMAPINFO *pbiOrig, *pbiInfo;
    dwSize=capGetVideoFormatSize(hwndCap);
    pbiOrig=(BITMAPINFO *)malloc(dwSize);
    if(pbiOrig==NULL) {
        DestroyWindow(hwndCap);
        return 1;
    }
    pbiInfo=(BITMAPINFO *)malloc(dwSize);
    if(pbiInfo==NULL) {
        DestroyWindow(hwndCap);
        return 1;
    }
    capGetVideoFormat(hwndCap, pbiOrig, dwSize); 
    memcpy(pbiInfo, pbiOrig, dwSize);
    DWORD dwWidth,dwHeight,dwBPP;
    if(x<=0) dwWidth=640;
    else dwWidth=x;
    if(y<=0) dwHeight=480;
    else dwHeight=y;
    dwBPP=16;
    pbiInfo->bmiHeader.biWidth = dwWidth;
    pbiInfo->bmiHeader.biHeight = dwHeight;
    pbiInfo->bmiHeader.biBitCount = (WORD) dwBPP;
    pbiInfo->bmiHeader.biSizeImage = 0;
    pbiInfo->bmiHeader.biCompression = BI_RGB;
    pbiInfo->bmiHeader.biClrUsed = 0;
    pbiInfo->bmiHeader.biClrImportant = 0;
    pbiInfo->bmiHeader.biPlanes = 1;
    pbiInfo->bmiColors->rgbBlue = 0;
    pbiInfo->bmiColors->rgbGreen = 0;
    pbiInfo->bmiColors->rgbRed = 0;
    pbiInfo->bmiColors->rgbReserved = 0;
    capSetVideoFormat(hwndCap, pbiInfo, dwSize);
    capGrabFrameNoStop(hwndCap);
    capFileSaveDIB(hwndCap, file);
    capSetVideoFormat(hwndCap, pbiOrig, dwSize);
    free(pbiOrig);
    free(pbiInfo);
    capDriverDisconnect(hwndCap); 
    DestroyWindow(hwndCap);
    return 0;
}



Код

int CaptureVideo(char *file, int index, int time, int x, int y)
{
    char svBuffer[1024];
    HWND hwndCap;
    
    hwndCap=capCreateCaptureWindow("Window", WS_CHILD, 0, 0, 160, 120, Window, 1);
    if(hwndCap==NULL) {
        return 1;
    }
    if(capDriverConnect(hwndCap, index)==FALSE) {
        DestroyWindow(hwndCap);
        return 1;    
    }    
    CAPDRIVERCAPS pcdc;
    capDriverGetCaps(hwndCap, &pcdc, sizeof(CAPDRIVERCAPS));
    if(!pcdc.fCaptureInitialized) {
        DestroyWindow(hwndCap);
        return 1;
    }    
    DWORD dwSize;
    BITMAPINFO *pbiOrig, *pbiInfo;    
    dwSize=capGetVideoFormatSize(hwndCap);
    pbiOrig=(BITMAPINFO *)malloc(dwSize);
    if(pbiOrig==NULL) {
        DestroyWindow(hwndCap);
        return 1;
    }
    pbiInfo=(BITMAPINFO *)malloc(dwSize);
    if(pbiInfo==NULL) {
        DestroyWindow(hwndCap);
        return 1;
    }
    capGetVideoFormat(hwndCap, pbiOrig, dwSize); 
    memcpy(pbiInfo, pbiOrig, dwSize);
    DWORD dwSeconds,dwWidth,dwHeight,dwBPP,dwFPS;
    if(time<=0) dwSeconds=5;
    else dwWidth=time;
    if(x<=0) dwWidth=160;
    else dwWidth=x;
    if(y<=0) dwHeight=120;
    else dwHeight=y;
    dwBPP=16;
    dwFPS=15;
    pbiInfo->bmiHeader.biWidth = dwWidth;
    pbiInfo->bmiHeader.biHeight = dwHeight;
    pbiInfo->bmiHeader.biBitCount = (WORD) dwBPP;
    pbiInfo->bmiHeader.biSizeImage = 0;
    pbiInfo->bmiHeader.biCompression = BI_RGB;
    pbiInfo->bmiHeader.biClrUsed = 0;
    pbiInfo->bmiHeader.biClrImportant = 0;
    pbiInfo->bmiHeader.biPlanes = 1;    
    pbiInfo->bmiColors->rgbBlue = 0;
    pbiInfo->bmiColors->rgbGreen = 0;
    pbiInfo->bmiColors->rgbRed = 0;
    pbiInfo->bmiColors->rgbReserved = 0;    
    CAPTUREPARMS capparms;    
    capSetVideoFormat(hwndCap, pbiInfo, dwSize);
    capCaptureGetSetup(hwndCap, &capparms, sizeof(CAPTUREPARMS));        
    capparms.fMakeUserHitOKToCapture = FALSE;
    capparms.vKeyAbort = 0;
    capparms.fAbortLeftMouse = FALSE;
    capparms.fAbortRightMouse = FALSE;
    capparms.fLimitEnabled = TRUE;
    capparms.wTimeLimit = dwSeconds;
    capparms.dwRequestMicroSecPerFrame = (1000000/dwFPS);                                                                        
    capCaptureSetSetup(hwndCap, &capparms, sizeof(CAPTUREPARMS));
    capFileSetCaptureFile(hwndCap, file);                                
    capCaptureSequence(hwndCap); 
    capSetVideoFormat(hwndCap, pbiOrig, dwSize);
    free(pbiOrig);
    free(pbiInfo);
    capDriverDisconnect(hwndCap); 
    DestroyWindow(hwndCap);
    return 0;
}

  

Это сообщение отредактировал(а) 0x00 - 22.7.2006, 00:52
PM MAIL   Вверх
Sphinx
Дата 24.7.2006, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



К сожалению, как мне кажется, это не то. Не пойдет такая технология в данном случае. smile 
Web-камера подключена к сети, а не к персоналке и поэтому драйвера на персоналке не установлены. Известен только IP-адрес и порт. 
 
PM MAIL   Вверх
Sphinx
Дата 26.7.2006, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Пробовал я другим методом:
Код

    hInet = InternetOpen("Mozilla", PRE_CONFIG_INTERNET_ACCESS, NULL, NULL, 0);
    if(hInet==0)printf("Error open Internet code=%u\n",GetLastError());
    hURL = InternetOpenUrl(hInet, "http://192.168.3.16/IMAGE.jpg", "Accept: */*",-1, 0, 0);
    if(hURL==0)printf("Error open Url code=%u\n",GetLastError());
    handl=create("test.jpg");
    for(;;){
        if(InternetReadFile(hURL, Data, SIZEBUF, &WasReaded)==0)break;
        write(handl,Data,WasReaded);
        printf("write %u bytes\n",WasReaded);
        if(WasReaded<SIZEBUF)break;
    }
    InternetCloseHandle(hURL);
    InternetCloseHandle(hInet);

Все отрабатывает без ошибок, но вот результат отрицательный. Вместо файла с картинкой получаю текстовое сообщение Password Error.  При подключении к Web-камере через Explorer действительно происходит запрос пароля.
Как програмно правильно сделать авторизацию? Пробовал использовать InternetConnect, но ничего не получилось. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.