windows平台利用opencv寻找桌面上的图像

首先抓取当前屏幕

//抓取当前屏幕函数
void Screen(){

	//创建画板
	HDC hScreen	= CreateDC("DISPLAY", NULL, NULL, NULL);
	HDC	hCompDC	= CreateCompatibleDC(hScreen);
	//取屏幕宽度和高度
	int		nWidth	= GetSystemMetrics(SM_CXSCREEN);	
	int		nHeight	= GetSystemMetrics(SM_CYSCREEN);
	//创建Bitmap对象
	hBmp	= CreateCompatibleBitmap(hScreen, nWidth, nHeight);
	hOld	= (HBITMAP)SelectObject(hCompDC, hBmp);
	BitBlt(hCompDC, 0, 0, nWidth, nHeight, hScreen, 0, 0, SRCCOPY);	
	SelectObject(hCompDC, hOld);
	//释放对象
	DeleteDC(hScreen);	
	DeleteDC(hCompDC);

}
//把HBITMAP型转成Mat型
BOOL HBitmapToMat(HBITMAP& _hBmp,Mat& _mat)

{
	//BITMAP操作
	BITMAP bmp;    
	GetObject(_hBmp,sizeof(BITMAP),&bmp);    
	int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8 ;   
	int depth = bmp.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U;    
	//mat操作
	Mat v_mat;
	v_mat.create(cvSize(bmp.bmWidth,bmp.bmHeight), CV_MAKETYPE(CV_8U,4));
	GetBitmapBits(_hBmp,bmp.bmHeight*bmp.bmWidth*nChannels,v_mat.data);  
	_mat=v_mat;
	return TRUE;   
}

用模版匹配寻找指定图像并返回坐标

//寻找指定图像
Point2f findimg(string a)
{
	Point2f place;
	templ = imread(a);
	imshow("templ",templ);
	//屏幕截图
	Screen();

	//类型转换
	HBitmapToMat(hBmp,src);

	DeleteObject(hBmp);
	cvtColor(src , img , CV_RGBA2RGB);//CV_RGBA2RGB表示4通道转成3通道

	int result_cols = img.cols - templ.cols + 1;
	int result_rows = img.rows - templ.rows + 1;
	result.create(result_cols, result_rows, CV_32FC1);

	matchTemplate(img, templ, result, 1);//这里我们使用的匹配算法是标准平方差匹配 method=CV_TM_SQDIFF_NORMED,数值越小匹配度越好
	normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());

	double minVal = -1;
	
	Point minLoc;
	Point maxLoc;
	Point matchLoc;
	
	minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());

	matchLoc = minLoc;

	place.x=matchLoc.x + templ.cols;
	place.y=matchLoc.y + templ.rows;
	return place;
}
声明:转载请注明出处,本人入门级菜鸟,内容大多学习于网络,存在问题太多不一一列举, 大佬多多指教. 本人QQ941131649


猜你喜欢

转载自blog.csdn.net/qq_18984151/article/details/79689732