OpenCVでデスクトップの画像を処理する方法です。直接、スクリーンショットを取得します。OpenCVのバージョンは2.2を使用しています。Xcodeで「ApplicationServices.framework」を追加しておいてください。
こちらを参考にしました。
- 画像とビデオの読み込みと書き込み — opencv v2.1 documentation
- iPhoneプログラミング記: iPhoneでOpenCVを使えるようにする(5)
- CocoaDev: ScreenShotCode
- デスクトップのスクリーンショットを取得 - kurusaki note
うまくいけば、画像のようになるはずです。ソースコードは以下から。
#include
#include
int main (int argc, char * const argv[])
{
/* ディスプレイのサイズ */
size_t width = CGDisplayPixelsWide(CGMainDisplayID());
size_t height = CGDisplayPixelsHigh(CGMainDisplayID());
/* RGBA用とBGR用のIplImageの作成 */
IplImage *iplimage = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 4);
IplImage *bgrimage = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
IplImage *resizeimage = cvCreateImage(cvSize(width/2, height/2), IPL_DEPTH_8U, 3);
/* グラフィックコンテキストの作成 */
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef contextRef = CGBitmapContextCreate(
iplimage->imageData, width, height,
iplimage->depth, iplimage->widthStep,
colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);
/* ウィンドウ */
cv::namedWindow("Screenshot", CV_WINDOW_AUTOSIZE);
while (true)
{
/* メインディスプレイからCGImageRefを取得 */
CGImageRef imageRef = CGDisplayCreateImage(CGMainDisplayID());
CGContextDrawImage(contextRef,
CGRectMake(0, 0, width, height),
imageRef);
/* RGBAからBGRに変換して,リサイズ */
cvCvtColor(iplimage, bgrimage, CV_RGBA2BGR);
cvResize(bgrimage, resizeimage);
/* ウィンドウへ表示 */
cv::imshow("Screenshot", resizeimage);
CGImageRelease(imageRef);
if(cv::waitKey(30) >= 0) break;
}
/* 解放 */
cvReleaseImage(&iplimage);
cvReleaseImage(&bgrimage);
cvReleaseImage(&resizeimage);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);
return 0;
}