C++ 试图修改Videocapture::retrieve()乐趣

C++ 试图修改Videocapture::retrieve()乐趣,c++,opencv,video,com,directshow,C++,Opencv,Video,Com,Directshow,我正在使用C920 Logitech网络摄像头进行对象识别项目 我想使用我自己的H264解码器来解码来自摄像机的压缩流(现在不关心性能和定时,这将受到我的H264解码器的影响) 我想破解bool VideoCapture::retrieve(Mat&image,int channel=0)并用我的H264解码器替换opencv retrieve()函数的解码器调用。 我考虑了两个解码器函数的返回类型和参数列表(两者都相似)。 但在集成/修改示例代码时,我面临以下问题。 因此,我的问题如下: I

我正在使用C920 Logitech网络摄像头进行对象识别项目

我想使用我自己的H264解码器来解码来自摄像机的压缩流(现在不关心性能和定时,这将受到我的H264解码器的影响)

我想破解
bool VideoCapture::retrieve(Mat&image,int channel=0)
并用我的H264解码器替换opencv retrieve()函数的解码器调用。
我考虑了两个解码器函数的返回类型和参数列表(两者都相似)。
但在集成/修改示例代码时,我面临以下问题。 因此,我的问题如下:

I am using OPENCV 3.0 VERSION .
Q.1)
对于下面的示例代码,我得到了错误-

#include "precomp.hpp"
#include "opencv2/opencv.hpp"

#include <strmif.h>
#include <iostream>

using namespace std ;
using namespace cv;

struct _AMMediaType;
typedef _AMMediaType AM_MEDIA_TYPE;

DEFINE_GUID(FORMAT_VideoInfo,0x05589f80,0xc356,0x11ce,0xbf,0x01,0x00,0xaa,0x00,0x55,0x59,0x5a);
DEFINE_GUID(MEDIATYPE_Video,0x73646976,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
DEFINE_GUID(MEDIASUBTYPE_RGB24,0xe436eb7d,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);


int main(int, char**)
{
    int t1= 10;
    int t2= 10;
    VideoCapture cap(0); // open the default camera
    cap.set(3,1280);
    cap.set(4,800);
    AM_MEDIA_TYPE mt;
    ZeroMemory(&mt,sizeof(AM_MEDIA_TYPE));

    mt.majortype     = MEDIATYPE_Video;
    mt.subtype       = MEDIASUBTYPE_RGB24;
    mt.formattype    = FORMAT_VideoInfo;

    if(!cap.isOpened())  // check if we succeeded
        return -1;

    for(;;)
    {

        Mat frame;
        if( !cap.grab() )
        {
            cout << "Can not grab images." << endl;
            return -1;
        }
        cap.retrieve(frame);
        imshow("cameracapture", frame);

        if(waitKey(30) >= 0) break;
    }
    // the camera will be deinitialized automatically in VideoCapture destructor
    return 0;
}
我链接了项目属性中的所有库(使用VS2012),但运气不佳:(

Q.2)
在OpenCV3.0\modules\videoio\src\cap\u dshow.cpp文件中:

    mt.majortype     = MEDIATYPE_Video;
    mt.subtype       = MEDIASUBTYPE_RGB24;
    mt.formattype    = FORMAT_VideoInfo;
由于我的LOGITECH C920相机支持H264编解码器,因此我尝试修改上述变量,并在示例代码中添加以下代码行-

    mt.majortype     = MEDIATYPE_Video;
    mt.subtype       = MEDIASUBTYPE_H264;
    mt.formattype    = FORMAT_VideoInfo;
我得到以下错误:

main.obj :error C2065: 'MEDIASUBTYPE_H264' : undeclared identifier
获得H264压缩视频需要哪些修改

Q-3)
如果我要修改OpenCV代码本身,那么我如何构建完整的OPENCV3.0代码(使用VS2012在windows中进行修改)并将其用于我的目的???

您需要定义以解决提到的链接器错误(有关详细信息,请参阅)

然而,在提供H.264解码器方面,我看不出它将如何帮助您(离这太远了)

要引用所需的H.264子类型标识符

#include <wmcodecdsp.h>
#pragma comment(lib, "wmcodecdspuuid.lib")
#包括
#pragma注释(lib,“wmcodedsdspuid.lib”)

谢谢Roman。您的回复对我解决我提出的第一个查询帮助很大。我主要集中在H264的第二个查询上。我没有找到DEFINE_GUID(MEDIASUBTYPE_H264,…)来解决第二个查询。我添加了以下代码行://H264//34363248-0000-0010-8000-00aa00389b71 DEFINE_GUID(MEDIASUBTYPE_H264,0x34363248,0x0000,0x0010,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71);//34363268-0000-0010-8000-00AA00389B71定义_GUID(MEDIASUBTYPE_H264,0x34363268,0x0000,0x0010,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71);如果我要修改OPENCV代码的任何一个源文件,您能告诉我如何构建OPENCV代码吗。(我在VS2012中使用windows 7)
#include <wmcodecdsp.h>
#pragma comment(lib, "wmcodecdspuuid.lib")