C++ OpenCV でスクリーンショットする
久しぶりにプログラミングしようと思ったら
参考にしてたサイト消えてた;;
サイト巡回しまくって苦労しないように あげます
追記:2016/11/25
検索用タグ:画面キャプチャ 画面取得 スクリーンショット
スクリーンキャプチャ デスクトップキャプチャ
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の解説
resizeの解説
http://opencv.jp/opencv-2.1/cpp/geometric_image_transformations.html
デスクトップの左端から400x200を切り取って 300x300に変形した図
ここまでくれば
テンプレートマッチを使って比較して
基本的なことは全てできるでしょう。
記憶を取り戻せて嬉しい