Opencv

デスクトップを仮想のカメラで撮影すればいい

近年流行りのインターネット動画配信
オンラインゲームを配信する人も大く、中身はDirectShowで仮想Webカメラでデスクトップを映しているというもの

あれ?これ使えばカメラキャプチャの要領でOpenCVをデスクトップキャプチャとして使えるかも?
と試してみた

SCFHのサイトから、SCFH Ver.0.4.1をダウンロード
http://mosax.sakura.ne.jp/yp4g/fswiki.cgi?page=SCFH+DSF

Ver.0.4.1 Binary: SCFHDSF041.zip (2009/11/16)

ニコ生で良く使われているという評判のSCFHを使ってみることにした
上記を解凍し、install64.bat(筆者の環境がWindows7 64bitのため)を実行

その2で使用したWebカメラ読み込みのプログラムをそのまま流用し、実行
変更したのはint camera_id = 0; → int camera_id = 2; にしたのみ
IDはそれぞれのユーザー環境で変わるため、うまく動かない場合は0、1、2・・・と変更していけばいつか当たると思われる


#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

int main(int argc, const char* argv[])
{
 //カメラのIDを0 → 2に変更。0はWebカメラ、1は良くわからないUSBカメラDriver、2にSCFHのIDが割り当てられていた
  int camera_id = 2;
  cv::VideoCapture cap(CV_CAP_DSHOW + camera_id);

  if(!cap.isOpened())
    return -1;

  cap.set(CV_CAP_PROP_FPS, 30.0);

  cv::namedWindow("image", cv::WINDOW_AUTOSIZE);
  cv::Mat frame;

  for(;;)
  {
    cap >> frame;

    if (frame.empty()) break;

    cv::imshow("image", frame);
    if(cv::waitKey(30) >= 0) break;
  }
  return 0;
}

CAP

























カメラのIDを2にするだけでデスクトップのキャプチャに成功した
ただ、画面サイズがSCFHのデフォルト?の小さいサイズとなってしまったため、
その3で出てきたデスクトップ情報取得を用い、画面サイズをそれぞれの環境に合わせる変更を追記してみた


#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

#include <windows.h> //追記

int main(int argc, const char* argv[])
{

  HWND desktop; //追記
  RECT rc; //追記
  desktop = GetDesktopWindow(); //追記
  GetWindowRect(desktop, &rc); //追記


  int camera_id = 2;
  cv::VideoCapture cap(CV_CAP_DSHOW + camera_id);

  if(!cap.isOpened())
    return -1;


 cap.set(CV_CAP_PROP_FRAME_WIDTH, rc.right); //追記
 cap.set(CV_CAP_PROP_FRAME_HEIGHT, rc.bottom); //追記

  cap.set(CV_CAP_PROP_FPS, 30.0);

  cv::namedWindow("image", cv::WINDOW_AUTOSIZE);
  cv::Mat frame;

  for(;;)
  {
    cap >> frame;

    if (frame.empty()) break;

    cv::imshow("image", frame);
    if(cv::waitKey(30) >= 0) break;
  }
  return 0;
}



上記のように変更し、OpenCVを用いた仮想Webカメラでのデスクトップ全画面キャプチャに成功した

次回は実際のゲームを使ってOpenCVを試してみようと思う