(旧)コダフォンの日記ブログ(移転しました)

FC2ブログに移転しました。ここいる?

C++ OpenCV でスクリーンショットする

久しぶりにプログラミングしようと思ったら

参考にしてたサイト消えてた;;

サイト巡回しまくって苦労しないように あげます

追記:2016/11/25

検索用タグ:画面キャプチャ 画面取得 スクリーンショット

スクリーンキャプチャ デスクトップキャプチャ

Visual C++OpenCVを導入する方法

http://homepage3.nifty.com/ishidate/opencv_1/opencv_1.htm

こちらのサイトを見れば解決

誤植があるので指摘

・VisualC++2010と2012はvc12じゃなくってvc10・vc11にする

・Pathの設定のとこは C:の後に\が抜けてる

・追加するライブラリの場所を指定するのとこは

C:\Program Files\opencv\build\x86\vc12\libのとこにbuildが入ってない

ここからソースコード

#include "stdafx.h"

#include<opencv2/highgui/highgui.hpp>

#include<opencv2/imgproc/imgproc.hpp>

#include<opencv2/opencv.hpp>

#include<Windows.h>

using namespace cv;

Mat cap(int,int,int,int);/*左端、上端、幅、高さで切り取る*/

Mat henkei(Mat,int,int);/*指定サイズに変形する*/

int _tmain(int argc, _TCHAR* argv[])

{

/* 画像の書き出し */

Mat image1 = cap(0,0,400,200);

image1 = henkei(image1,300,300);

namedWindow("mado1");

imshow("mado1",image1);

waitKey(0);

return 0;

}

Mat cap(int hidari,int ue,int haba,int takasa){

/* デスクトップのサイズ */

HWND desktop = GetDesktopWindow();

RECT rect;

GetWindowRect(desktop, &rect);

int width = rect.right;

int height = rect.bottom;

/* RGB用と反転用とリサイズ用のIplImageの作成 */

IplImage *iplimage = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U, 3);

IplImage *flipimage = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);

/* DIBの情報を設定する */

BITMAPINFO bmpInfo;

bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

bmpInfo.bmiHeader.biWidth = width;

bmpInfo.bmiHeader.biHeight = height;

bmpInfo.bmiHeader.biPlanes = 1;

bmpInfo.bmiHeader.biBitCount = 24;

bmpInfo.bmiHeader.biCompression = BI_RGB;

/* DIBSection作成 */

LPDWORD lpPixel;

HDC hDC = GetDC(desktop);

HBITMAP hBitmap = CreateDIBSection(hDC, &bmpInfo, DIB_RGB_COLORS, (void**)&lpPixel, NULL, 0);

HDC hMemDC = CreateCompatibleDC(hDC);

SelectObject(hMemDC, hBitmap);

/* IplImageヘッダにデータをセット */

iplimage->imageData = (char *)lpPixel;

/* ウィンドウ */

/* デスクトップから取得 */

BitBlt(hMemDC, 0, 0, width, height, hDC, 0, 0, SRCCOPY);

/* 上下反転して,リサイズ */

cvFlip(iplimage, flipimage);

cv::Mat moto1 = flipimage;

/* 切り取り */

Mat cut1 = moto1(Rect(hidari,ue,haba,takasa));

/*namedWindow("eru");

imshow("eru",moto1);

waitKey(0);*/

return cut1;

/* 解放 */

cvReleaseImageHeader(&iplimage);

cvReleaseImage(&flipimage);

ReleaseDC(desktop, hDC);

DeleteDC(hMemDC);

DeleteObject(hBitmap);

}

Mat henkei(Mat decoy,int num1,int num2){

Mat im1;

resize(decoy, im1, Size(num1,num2),INTER_CUBIC);

return im1;

}

最後の部分はこれに直してくださいhttp://605050end.blog.fc2.com/blog-entry-368.html

偉そうに書いたけど Mat cap(int,int,int,int);の中身は7割くらい引用なのです

他んところもやってるし良いよね。

Rectの解説

http://www.me.sie.dendai.ac.jp/labWiki/wiki.cgi?page=%B2%E8%C1%FC%A4%CE%B0%EC%C9%F4%A4%CE%A4%DF%A4%F2%BD%E8%CD%FD%C2%D0%BE%DD%A4%CB

resizeの解説

http://opencv.jp/opencv-2.1/cpp/geometric_image_transformations.html

デスクトップの左端から400x200を切り取って 300x300に変形した図

aeaeaeaedesu201509.png

ここまでくれば

テンプレートマッチを使って比較して

基本的なことは全てできるでしょう。

記憶を取り戻せて嬉しい