2014-12-13 305 views
-1

我正在使用C920 Logitech网络摄像机物体识别项目试图修改Videocapture :: retrieve()乐趣

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

我想破解bool VideoCapture::retrieve(Mat& image, int channel=0)并用我的H264解码器替换opencv retrive()函数的解码器调用。
我关心返回类型以及两个解码器功能的参数列表(都是类似的)。
但我面临以下问题在集成/修改我的示例代码。 所以我的查询是下面:

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; 
} 

我收到下面的链接错误:

1>main.obj : error LNK2001: unresolved external symbol FORMAT_VideoInfo 
1>main.obj : error LNK2001: unresolved external symbol MEDIATYPE_Video 
1>main.obj : error LNK2001: unresolved external symbol MEDIASUBTYPE_RGB24 

我联系所有的lib中我的项目属性(通过使用VS2012),但没有运气:(

Q.2)在OpenCV3.0 \模块\ videoio \ SRC \ cap_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的窗口中进行修改)并将其用于我的目的?

回答

1

您需要定义INITGUID以解决上述链接器错误(有关详细信息,请参阅Referencing GUIDs)。

但是我不明白它将如何帮助您提供H.264解码器(距离那里太远)。

要引用H.264亚型标识需要

#include <wmcodecdsp.h> 
#pragma comment(lib, "wmcodecdspuuid.lib") 
+0

感谢罗马。您的回复我有很大帮助解决第一个查询我问。我是主要集中在第二查询H264。我没找到DEFINE_GUID(MEDIASUBTYPE_H264,....)解决第二个查询 – Ashwin 2014-12-13 08:07:50

+0

我已添加followiong行代码:// 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 DEFINE_GUID(MEDIASUBTYPE_h264,0x34363268,0x0000,0x0010,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71); – Ashwin 2014-12-13 08:23:54

+0

你可以告诉我,如何构建OPENCV代码,如果我将修改任何一个opencv代码源文件(我正在使用VS2012的windows 7) – Ashwin 2014-12-13 08:32:01