Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
媒体基金会毫秒曝光 在我问我的问题之前,我需要说明我主要是Linux C++开发人员,并且没有编写Windows应用程序的丰富经验。我使用g++编译所有代码,而不是使用Microsoft编译器_C++_Windows_Directshow_Ms Media Foundation_Uvc - Fatal编程技术网

媒体基金会毫秒曝光 在我问我的问题之前,我需要说明我主要是Linux C++开发人员,并且没有编写Windows应用程序的丰富经验。我使用g++编译所有代码,而不是使用Microsoft编译器

媒体基金会毫秒曝光 在我问我的问题之前,我需要说明我主要是Linux C++开发人员,并且没有编写Windows应用程序的丰富经验。我使用g++编译所有代码,而不是使用Microsoft编译器,c++,windows,directshow,ms-media-foundation,uvc,C++,Windows,Directshow,Ms Media Foundation,Uvc,背景 一段时间以来,我一直在开发一个支持各种专业摄像机的科学成像应用程序。大多数相机都有制造商提供的SDK,这使得开发更加容易。但是,我的应用程序支持的一些相机是标准的UVC相机。直到最近,这个应用程序一直是专门针对Linux的,但现在正被移植到macOS和Windows Linux端口通过Video4Linux实现对UVC的支持,并且可以正常工作 非常好 macOS端口通过libuvc实现对UVC的支持 )而且效果很好 问题:Windows UVC支持 我在Windows上实现UVC摄像头时遇

背景

一段时间以来,我一直在开发一个支持各种专业摄像机的科学成像应用程序。大多数相机都有制造商提供的SDK,这使得开发更加容易。但是,我的应用程序支持的一些相机是标准的UVC相机。直到最近,这个应用程序一直是专门针对Linux的,但现在正被移植到macOS和Windows

  • Linux端口通过Video4Linux实现对UVC的支持,并且可以正常工作 非常好
  • macOS端口通过libuvc实现对UVC的支持 )而且效果很好
  • 问题:Windows UVC支持

    我在Windows上实现UVC摄像头时遇到问题。我已经编写了DirectShow和Media Framework处理器,它们工作得很好,可以控制增益、亮度、对比度等参数,正如我所需要的V4L2一样。然而,当我尝试实施曝光控制时,问题就出现了

    如果我使用特定的UVC相机,其记录的曝光范围为1ms到1000ms,那么我可以使用V4L2\u CID\u exposure\u ABSOLUTE使用Video4Linux的全曝光范围。当应用新曝光时,我看到输出图像有一个很好的线性变化。在macOS上使用libuvc时,我可以观察到同样的情况

    在使用DirectShow或Media Foundation的Windows上使用同一相机时,曝光范围是非常不同的。我使用以下代码查询曝光控制的范围:

    HRESULT hr;
    IAMCameraControl *cam_ctrl = NULL;
    
    long lmin, lmax, lstep, ldft, lcap;
    
    hr = m_imf_media_source->QueryInterface(IID_IAMCameraControl, (void**) &cam_ctrl);
    if (FAILED(hr))
    {
        throw_error(hr);
    }
    hr = cam_ctrl->GetRange(CameraControl_Exposure, &lmin, &lmax, &lstep, &ldft, &lcap);
    
    if (FAILED(hr))
    {
        if (hr == E_PROP_ID_UNSUPPORTED)
        {
            *min = 0;
            *max = 0;
            *value = 0;
            return false;
        }
        else
        {
            throw_error(hr);
        }
    }
    *min = static_cast<int>(lmin);
    *max = static_cast<int>(lmax);
    *value = static_cast<int>(ldft);
    
    return true;
    
    HRESULT-hr;
    IAMCameraControl*cam\U ctrl=NULL;
    长lmin、lmax、lstep、ldft、lcap;
    hr=m_imf_media_source->QueryInterface(IID_IAMCameraControl,(void**)和cam_ctrl);
    如果(失败(小时))
    {
    抛出错误(hr);
    }
    hr=cam\u ctrl->GetRange(CameraControl\u曝光,&lmin,&lmax,&lstep,&ldft,&lcap);
    如果(失败(小时))
    {
    如果(hr==E_PROP_ID_UNSUPPORTED)
    {
    *最小值=0;
    *max=0;
    *数值=0;
    返回false;
    }
    其他的
    {
    抛出错误(hr);
    }
    }
    *最小值=静态压力(lmin);
    *最大值=静态压力(lmax);
    *值=静态施法(ldft);
    返回true;
    
    如文档所述,从proc_amp->GetRange中发现的值不是实时单位。例如,该值为-11到-3,对于支持大于1000ms曝光的某些UVC相机,该值为正值。当我将曝光应用于流时,步骤非常粗糙。如前所述,Linux下这个特定相机的曝光步骤是线性的,有数百个步骤。在窗户里只有大约14个

    我的主要问题是:在DirectShow或Media Foundation中使用具有实时单元的UVC摄像机是可能的,如果是,这是如何做到的?如果有人有意见的话,我很乐意考虑另一种方法。遗憾的是,这种粗略的曝光步骤是不可接受的

    我知道Windows支持libuvc,但它需要安装一个特定的驱动程序,这是我不希望我的用户做的事情

    非常感谢您的帮助


    Amanda。

    您是否尝试过“使用KSPROPERTY\u CAMERACONTROL\u EXTENDED\u EXPOSUREMODE属性,当用于手动设置曝光时,KSCAMERA\u EXTENDEDPROP\u VIDEOPROCFLAG\u MANUAL,VideoProc.Value.ul值是以100纳秒为单位的曝光时间。”事实上,根据您的上下文,使用WinRT的MediaCapture类可能更容易:它有VideoDeviceController来配置exposureKSPROPERTY\u CAMERACONTROL\u EXTENDED\u EXPOSUREMODE似乎正是我需要的。你知道有什么C++示例代码演示了如何使用这个属性吗?我不知道,这里有一个例子:但不清楚你是否能真正使用它。一个微软的家伙明确地说官方访问是WinRT。。。也许你可以插话。