4

您知道如何使用 OpenCV-DirectShow(无 VFW)从网络摄像头获取原始 YUY2图像吗?

http://opencv.willowgarage.com/wiki/CameraCapture :我使用示例成功获取 IPL 图像(英特尔处理库图像)。

使用代码中的函数 cvShowImage(),图像在屏幕上很漂亮。但我不想在屏幕上显示图像,也不想 IPL 格式,我只想要 YUYV 原始数据......

wiki 页面的第二部分将是我想要的,但 deviceSetupWithSubtype() 在 OpenCV 2.4 中似乎不再存在(甚至谷歌也不知道)。

编辑:我发现:它在页面上链接的 rar 文件中!Google 不会在 rar 文件中“看到”。这是链接:http ://opencv.willowgarage.com/wiki/CameraCapture?action=AttachFile&do=get&target=Camera+property+Settings.rar 。我要研究这个。

4

2 回答 2

2

以防其他人偶然发现:

ffmpeg 有一个很好的 Windows API,允许捕获原始 YUV 图像。无论是 CLI:

ffmpeg.exe -f dshow -i video="your-webcam" -vframes 1 test.yuv

或他们的 c API:

AVFormatContext *camera = NULL;
  AVPacket packet;
  avdevice_register_all();
  AVInputFormat *inFrmt = av_find_input_format("dshow");
  int ret = avformat_open_input(&camera, "video=your-webcam", inFrmt, NULL);
  av_init_packet(&packet);

  while (int ret = av_read_frame(camera, &packet) >= 0) {
    // packet.data has raw image data
  }
于 2019-02-13T19:11:22.377 回答
0

通常,opencv 使用 directshow 从 Windows 中的网络摄像头获取 RGB 帧。Opencv VideoCapture 类获取 CV_CAP_PROP_CONVERT_RGB 属性(布尔标志,指示是否应将图像转换为 RGB),但它不适用于我的所有网络摄像头。

而不是编写 DirectShow 代码并制作您自己的示例抓取器和回调来获取这里描述的 YUY2 数据(他们已经制作了很棒的工具来简化 directshow 开发。)我修改了 CameraDs和(setup Doc)类(网页是中文的)获取 YUY2 数据。

在 CameraDs.cpp 中更改mt.subtype = MEDIASUBTYPE_RGB24;mt.subtype = MEDIASUBTYPE_YUY2;(检查您的网络摄像头是否支持此)

并制作 2 通道 YUY2 图像而不是 RGB 3 通道。

m_pFrame = cvCreateImage(cvSize(m_nWidth, m_nHeight), IPL_DEPTH_8U, 2);

并在外部获取 YUY2 数据并使用 opencv 接口将其更改为 RGB,例如:

{
               //query frame
               IplImage * pFrame = camera. QueryFrame();


               //change them to rgb
               Mat yuv (480, 640,CV_8UC2 ,pFrame-> imageData);
               Mat rgb (480, 640,CV_8UC3 );

               cvtColor(yuv ,rgb, CV_YUV2BGRA_YUY2);

               //show image
               //cvShowImage("camera", rgb);
               imshow("camera" ,rgb);

               if ( cvWaitKey(20 ) == 'q')
                      break;
        } 
于 2014-08-06T03:44:44.097 回答