#1 2011-11-16 21:54:17
Logitech QuickCam Orbit/Sphere AF(MP) PTZ (Remote) Control
實現近端及遠端控制羅技瞭望台Logitech QuickCam Orbit/Sphere AF 或 MP 機械上下左右及數位放大縮小.
作業平台:WINDOWS XP
驅動程式:Logitech QuickCam 11
編譯程式:Microsoft Visual C++ 2005 Express 版(另需Microsoft Windows SDK v6.0以上)
程式及原始碼: http://webhd.xuite.net/_oops/arda.yang/aiu
LGPTZ
//專案>屬性>連結器>輸入>其他相依性>strmiids.lib oleaut32.lib ole32.lib
#include 
#include                 // Required by KsMedia.h
#include         // For KSPROPERTY_CAMERACONTROL_FLAGS_*
long pan=0,tilt=0,zoom=0;
int reset=0;
HRESULT set_mechanical_pan_relative(IAMCameraControl *pCameraControl, long value)
{
    HRESULT hr = 0;
    long flags = KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE | KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
    hr = pCameraControl->Set(CameraControl_Pan, value, flags);
    if(hr != S_OK)
        //fprintf(stderr, "ERROR: Unable to set CameraControl_Pan property value to %d. (Error 0x%08X)\n", value, hr);
    Sleep(100);
    return hr;
}
HRESULT set_mechanical_tilt_relative(IAMCameraControl *pCameraControl, long value)
{
    HRESULT hr = 0;
    long flags = KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE | KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
    hr = pCameraControl->Set(CameraControl_Tilt, value, flags);
    if(hr != S_OK)
        //fprintf(stderr, "ERROR: Unable to set CameraControl_Tilt property value to %d. (Error 0x%08X)\n", value, hr);
    Sleep(100);
    return hr;
}
void reset_machanical_pan_tilt(IAMCameraControl *pCameraControl)
{
    set_mechanical_tilt_relative(pCameraControl, 180);
    Sleep(600);
    set_mechanical_pan_relative(pCameraControl, 180);
    Sleep(800);
    set_mechanical_tilt_relative(pCameraControl, -24);
    Sleep(600);
    set_mechanical_pan_relative(pCameraControl, -64);
    //Sleep(600);
}
HRESULT set_digital_zoom_absolute(IAMCameraControl *pCameraControl, long value)
{
    HRESULT hr = 0;
    long flags = KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE | KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
    hr = pCameraControl->Set(CameraControl_Zoom, value, flags);
    if(hr != S_OK)
        //fprintf(stderr, "ERROR: Unable to set CameraControl_Zoom property value to %d. (Error 0x%08X)\n", value, hr);
    return hr;
}
void reset_digital_zoom(IAMCameraControl *pCameraControl)
{
    set_digital_zoom_absolute(pCameraControl, 50);
}
HRESULT test_pan_tilt(IBaseFilter *pBaseFilter)
{
    HRESULT hr = 0;
    IAMCameraControl *pCameraControl = NULL;
    long value = 0, flags = 0;
    // Get a pointer to the IAMCameraControl interface used to control the camera
    hr = pBaseFilter->QueryInterface(IID_IAMCameraControl, (void **)&pCameraControl);
    if(hr != S_OK)
    {
        fprintf(stderr, "ERROR: Unable to access IAMCameraControl interface.\n");
        return hr;
    }
if (reset == 1)    
{
    printf("    Resetting pan/tilt/zoom ...\n");
    //reset_digital_pan_tilt(pCameraControl);
    reset_digital_zoom(pCameraControl);
    reset_machanical_pan_tilt(pCameraControl);
    Sleep(600);
}    
else
{
    set_digital_zoom_absolute(pCameraControl, zoom);
    
    set_mechanical_tilt_relative(pCameraControl, tilt);
    if (tilt != 0 ){Sleep(600);}
    
    set_mechanical_pan_relative(pCameraControl, pan);
    if (pan != 0 ){Sleep(600);}
}
    return S_OK;
}
void process_filter(IBaseFilter *pBaseFilter)
{
    test_pan_tilt(pBaseFilter);
}
int enum_devices()
{
    HRESULT hr;
    // Create the System Device Enumerator.
    ICreateDevEnum *pSysDevEnum = NULL;
    hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
        IID_ICreateDevEnum, (void **)&pSysDevEnum);
    if(FAILED(hr))
    {
        fprintf(stderr, "ERROR: Unable to create system device enumerator.\n");
        return hr;
    }
    // Obtain a class enumerator for the video input device category.
    IEnumMoniker *pEnumCat = NULL;
    hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0);
    if(hr == S_OK) 
    {
        // Enumerate the monikers.
        IMoniker *pMoniker = NULL;
        ULONG cFetched;
        while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
        {
            IPropertyBag *pPropBag;
            hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, 
                (void **)&pPropBag);
            if(SUCCEEDED(hr))
            {
                // To retrieve the filter's friendly name, do the following:
                VARIANT varName;
                VariantInit(&varName);
                hr = pPropBag->Read(L"FriendlyName", &varName, 0);
                if (SUCCEEDED(hr))
                {
                    // Display the name in your UI somehow.
                    wprintf(L"  Found device: %s\n", varName.bstrVal);
                }
                VariantClear(&varName);
                // To create an instance of the filter, do the following:
                IBaseFilter *pFilter;
                hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,
                    (void**)&pFilter);
                
                process_filter(pFilter);                
                //Remember to release pFilter later.
                pPropBag->Release();
            }
            pMoniker->Release();
        }
        pEnumCat->Release();
    }
    pSysDevEnum->Release();
    return 0;
}
int main(int argc, char* argv[])
{
        reset = argc;
    if (argc-1 >= 3 )
    {
        pan  = atol(argv[1]);
        tilt = atol(argv[2]);
        zoom = atol(argv[3]);
    }    
    else
    {
        printf("\n");
        printf("Logitech QuickCam Orbit/Sphere AF PTZ Control. \n");
        printf("LGPTZ [Pan Tilt Zoom(50,100,150,200)] \n");
        printf("LGPTZ 0 0 200 \n");
        printf("LGPTZ 10 -10 50 \n");
        printf("LGPTZ -15 15 100 \n");
        printf("LGPTZ -20 -20 150 \n");
        printf("\n");
    }    
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
        enum_devices();
    CoUninitialize();
    return 0;
}   
LGPTZSV
//專案>屬性>連結器>輸入>其他相依性>WSock32.Lib strmiids.lib oleaut32.lib ole32.lib
#include 
#include 
#include 
#include                 // Required by KsMedia.h
#include         // For KSPROPERTY_CAMERACONTROL_FLAGS_*
char port[32]="8766";
long pan=0,tilt=0,zoom=0;
int reset=0;
HRESULT set_mechanical_pan_relative(IAMCameraControl *pCameraControl, long value)
{
    HRESULT hr = 0;
    long flags = KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE | KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
    hr = pCameraControl->Set(CameraControl_Pan, value, flags);
    if(hr != S_OK)
        //fprintf(stderr, "ERROR: Unable to set CameraControl_Pan property value to %d. (Error 0x%08X)\n", value, hr);
    Sleep(100);
    return hr;
}
HRESULT set_mechanical_tilt_relative(IAMCameraControl *pCameraControl, long value)
{
    HRESULT hr = 0;
    long flags = KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE | KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
    hr = pCameraControl->Set(CameraControl_Tilt, value, flags);
    if(hr != S_OK)
        //fprintf(stderr, "ERROR: Unable to set CameraControl_Tilt property value to %d. (Error 0x%08X)\n", value, hr);
    Sleep(100);
    return hr;
}
void reset_machanical_pan_tilt(IAMCameraControl *pCameraControl)
{
    set_mechanical_tilt_relative(pCameraControl, 180);
    Sleep(600);
    set_mechanical_pan_relative(pCameraControl, 180);
    Sleep(800);
    set_mechanical_tilt_relative(pCameraControl, -24);
    Sleep(600);
    set_mechanical_pan_relative(pCameraControl, -64);
    //Sleep(600);
}
HRESULT set_digital_zoom_absolute(IAMCameraControl *pCameraControl, long value)
{
    HRESULT hr = 0;
    long flags = KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE | KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
    hr = pCameraControl->Set(CameraControl_Zoom, value, flags);
    if(hr != S_OK)
        //fprintf(stderr, "ERROR: Unable to set CameraControl_Zoom property value to %d. (Error 0x%08X)\n", value, hr);
    return hr;
}
void reset_digital_zoom(IAMCameraControl *pCameraControl)
{
    set_digital_zoom_absolute(pCameraControl, 50);
}
HRESULT test_pan_tilt(IBaseFilter *pBaseFilter)
{
    HRESULT hr = 0;
    IAMCameraControl *pCameraControl = NULL;
    long value = 0, flags = 0;
    hr = pBaseFilter->QueryInterface(IID_IAMCameraControl, (void **)&pCameraControl);
    if(hr != S_OK)
    {
        fprintf(stderr, "ERROR: Unable to access IAMCameraControl interface.\n");
        return hr;
    }
if (reset == 1)    
{
    printf("    Resetting pan/tilt/zoom ...\n");
    //reset_digital_pan_tilt(pCameraControl);
    reset_digital_zoom(pCameraControl);
    reset_machanical_pan_tilt(pCameraControl);
    Sleep(600);
}    
else
{
    set_digital_zoom_absolute(pCameraControl, zoom);    
    set_mechanical_tilt_relative(pCameraControl, tilt);
    if (tilt != 0 ){Sleep(600);}
    set_mechanical_pan_relative(pCameraControl, pan);
    if (pan != 0 ){Sleep(600);}
}
    return S_OK;
}
void process_filter(IBaseFilter *pBaseFilter)
{
    test_pan_tilt(pBaseFilter);
}
int enum_devices()
{
    HRESULT hr;
    // Create the System Device Enumerator.
    ICreateDevEnum *pSysDevEnum = NULL;
    hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
        IID_ICreateDevEnum, (void **)&pSysDevEnum);
    if(FAILED(hr))
    {
        fprintf(stderr, "ERROR: Unable to create system device enumerator.\n");
        return hr;
    }
    // Obtain a class enumerator for the video input device category.
    IEnumMoniker *pEnumCat = NULL;
    hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0);
    if(hr == S_OK) 
    {
        // Enumerate the monikers.
        IMoniker *pMoniker = NULL;
        ULONG cFetched;
        while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
        {
            IPropertyBag *pPropBag;
            hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, 
                (void **)&pPropBag);
            if(SUCCEEDED(hr))
            {
                // To retrieve the filter's friendly name, do the following:
                VARIANT varName;
                VariantInit(&varName);
                hr = pPropBag->Read(L"FriendlyName", &varName, 0);
                if (SUCCEEDED(hr))
                {
                    // Display the name in your UI somehow.
                    wprintf(L"  Found device: %s\n", varName.bstrVal);
                }
                VariantClear(&varName);
                // To create an instance of the filter, do the following:
                IBaseFilter *pFilter;
                hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,
                    (void**)&pFilter);
                
                process_filter(pFilter);                
                //Remember to release pFilter later.
                pPropBag->Release();
            }
            pMoniker->Release();
        }
        pEnumCat->Release();
    }
    pSysDevEnum->Release();
    return 0;
}
int enum_devices_ok()
{
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
        enum_devices();
    CoUninitialize();
    return 0;
}
int main(int argc, char *argv[])
{
      printf("\n");
      printf("Logitech QuickCam Orbit/Sphere AF PTZ Remote Control Server. \n");
      printf("LGPTZSV [port] \n");
      printf("LGPTZSV 8766 \n");
      printf("\n");
    if (argc -1 == 1)
    {
    strcpy(port,argv[1]);
    printf("PORT: %s\n",port);
    }
  SOCKET server_sockfd, client_sockfd;
  int server_len, client_len;
  struct sockaddr_in server_address;
  struct sockaddr_in client_address;
  // 註冊 Winsock DLL
  WSADATA wsadata;
  if(WSAStartup(0x101,(LPWSADATA)&wsadata) != 0) {
    printf("Winsock Error\n");
    exit(1);
  }
  // 產生 server socket
  server_sockfd = socket(AF_INET, SOCK_STREAM, 0); // AF_INET(使用IPv4); SOCK_STREAM; 0(使用預設通訊協定,即TCP)
  if(server_sockfd == SOCKET_ERROR) {
    printf("Socket Error\n");
    exit(1);
  }
  server_address.sin_family = AF_INET; // AF_INT(使用IPv4)
  server_address.sin_addr.s_addr = INADDR_ANY; // 設定IP位址
  server_address.sin_port = htons(int(atoi(port))); //設定埠號
  server_len = sizeof(server_address);
  if(bind(server_sockfd, (struct sockaddr *)&server_address, server_len) < 0) {
    printf("Bind Error\n");
    exit(1);
  }
  if(listen(server_sockfd, 5) < 0) {
    printf("Listen Error\n");
    exit(1);
  }
  while(1) {
    char ch;
    printf("Server waiting...\n");
    client_len = sizeof(client_address);
    client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
    if(client_sockfd == SOCKET_ERROR) {
      printf("Accept Error\n");
      exit(1);
    }
    recv(client_sockfd, &ch, 1, 0); // Linux socket programming 為 read
    //printf("%c \n",ch);
        if (ch == 114)
        {
            pan  = 5;
            enum_devices_ok();
            pan  = 0;
        }
        if (ch == 108)
        {
            pan  = -5;
            enum_devices_ok();
            pan  = 0;
        }
        if (ch == 117)
        {
            tilt = -5;
            enum_devices_ok();
            tilt = 0;
        }
        if (ch == 100)
        {
            tilt = 5;
            enum_devices_ok();
            tilt = 0;
        }
        if (ch == 122)
        {
            zoom = zoom - 50;
            if (zoom < 49){zoom = 50;}
            enum_devices_ok();
        }
        if (ch == 90)
        {
            zoom = zoom + 50;
            if (zoom > 201){zoom = 200;}
            enum_devices_ok();
        }
        if (ch == 111)
        {
            reset = 1;
            enum_devices_ok();
            reset = 0;
        }
    closesocket(client_sockfd); // Linux socket programming 為 close
  }
}     
LGPTZCL
//專案>屬性>連結器>輸入>其他相依性>WSock32.Lib
#include<winsock2.h>
#include<stdio.h>
char ch[32] = "o";
char ip[32]="127.0.0.1";
char port[32]="8766";
int main(int argc, char *argv[]) {
  SOCKET sockfd;
  int len;
  struct sockaddr_in address;
  int result;
    if (argc -1 < 1) 
    {
      printf("\n");
      printf("Logitech QuickCam Orbit/Sphere AF PTZ Remote Control Client. \n");
      printf("LGPTZCL [[PTZ COMMAND[r l u d z Z o O ]] [ip] [port]] \n");
      printf("LGPTZCL o 127.0.0.1 \n");
      printf("LGPTZCL o 127.0.0.1 8766\n");
      printf("\n");
      return 0;
    }
    if (argc -1 == 2)
    {
    strcpy(ip,argv[2]);
    }
  
    if (argc -1 == 3)
    {
    strcpy(ip,argv[2]);
    strcpy(port,argv[3]);
    }
  WSADATA wsadata;
  if(WSAStartup(0x101,(LPWSADATA)&wsadata) != 0) {
    printf("Winsock Error\n");
    exit(1);
  }
  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  address.sin_family = AF_INET;
  address.sin_addr.s_addr = inet_addr(ip);
  address.sin_port = htons(int(atoi(port)));
  len = sizeof(address);
  result = connect(sockfd, (struct sockaddr *)&address, len);
  if(result == -1) {
    printf("Connetc Error");
    exit(1);
  }
strcpy(ch,argv[1]);
//printf("send = %s\n", ch);
  send(sockfd, ch, 1, 0);
  //recv(sockfd, ch, 1, 0);
  //printf("char from server = %s\n", ch);
  closesocket(sockfd);
  exit(0);
}
PHP SEND
$service_port = '8766';
$address = '192.168.1.21';
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
echo "socket_create() errore: ".socket_strerror($socket);
}
$result = socket_connect($socket, $address, $service_port);
if ($result < 0) {
    echo "socket_connect() errore:($result)".socket_strerror($result);
}
$in = "o"; // r l u p z Z o
socket_write($socket, $in, strlen ($in));
socket_close($socket);
?>
參考資料:
http://www.quickcamteam.net/documentati … ch-cameras
http://sites.google.com/site/ucanlab/Ho … with-dev-c
最後修改: ardayang (2011-11-18 18:27:53)
離線
相關討論主題
| 主題 | 回覆 | 點閱 | 最後發表 | 
|---|---|---|---|
| 
                                transmission-remote 作者 tankjaw
                             | 1 | 11860 | 2011-02-22 10:44:16 作者 tankjaw | 
| 
                                ATI Remote Control USB遙控器 遙控500gP執行程式 作者 ardayang
                             | 1 | 22006 | 2008-12-10 23:53:53 作者 Aven | 










