class.exe

blog.netaka.net

OpenCVでスクリーンショット(Mac OS X)

12/31/2010

この記事を書いてから12年が経っています。内容が古いかもしれません。

スクリーンショット(Mac OSX)
スクリーンショット(Mac OSX)

OpenCVでデスクトップの画像を処理する方法です。直接、スクリーンショットを取得します。OpenCVのバージョンは2.2を使用しています。Xcodeで「ApplicationServices.framework」を追加しておいてください。

こちらを参考にしました。

うまくいけば、画像のようになるはずです。ソースコードは以下から。

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