デスクトップを仮想のカメラで撮影すればいい
近年流行りのインターネット動画配信
オンラインゲームを配信する人も大く、中身は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;
}
カメラの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を試してみようと思う
オンラインゲームを配信する人も大く、中身は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;
}
カメラの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を試してみようと思う