opencv 绘制矩形,提取矩形区域的直方图

#include <iostream>
#include <opencv2/opencv.hpp>
#include <sstream>
using namespace std;
using namespace  cv;
Mat g_img;//全局变量,以便在mouse函数中进行使用
string tile("窗口");//全局的窗口名字
void Mouse(int event, int x, int y, int flag, void *)
{
	static Point FirstPos;//第一次按下左键的鼠标点
	static Point EndPos;
	char text[100];//用于在图像中显示灰度值...用于显示鼠标移动过程中的坐标点
	memset(text, 0, sizeof(char)* 100);
	if (event==EVENT_LBUTTONDOWN)
	{
		FirstPos.x = x;
		FirstPos.y = y;
	}
	if ((event==EVENT_MOUSEMOVE)&&(flag&EVENT_LBUTTONDOWN))
	{
		Mat temp = g_img.clone();//在临时变量中进行绘图操作
		EndPos.x = x;
		EndPos.y = y;
		sprintf_s(text, "(%d,%d)", x, y);
		putText(temp, text, EndPos, FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 255));
		rectangle(temp, FirstPos, EndPos, Scalar(0, 255, 0), 1, CV_AA);
		imshow(tile, temp);
	}
	if (event==EVENT_LBUTTONUP)
	{
		Mat temp = g_img.clone();
		rectangle(temp, FirstPos, EndPos, Scalar(0, 255, 0), 1, CV_AA);
		imshow(tile, temp);
		//在另一个图像中绘制选择区域的直方图
		string hist("Histgorm");
		Mat ImgROI = temp((FirstPos.y < EndPos.y) ? Range(FirstPos.y, EndPos.y) : Range(EndPos.y, FirstPos.y), (FirstPos.x < EndPos.x ? Range(FirstPos.x, EndPos.x) : Range(EndPos.x, FirstPos.x)));
		vector<Mat> planes;
		split(ImgROI, planes);//分解区域
		float RangeB[] = { 0, 255 };
		const float *range = { RangeB};
		Mat histB, histG, histR;
		int histSize = 255 / 8;//直方图的bin的数目
		int channel = 0;
		calcHist(&planes[0], 1, 0, Mat(), histB, 1, &histSize, &range,true,false);
		calcHist(&planes[1], 1, 0, Mat(), histG, 1, &histSize, &range);
		calcHist(&planes[2], 1, 0, Mat(), histR, 1, &histSize, &range);
		int hist_w = 400; int hist_h = 400;
		int bin_w = cvRound((double)hist_w / histSize);
		Mat histImage(hist_w, hist_h, CV_8UC3, Scalar(0, 0, 0));//创建直方图影像
		//将直方图的灰度进行归一化处理,防止越界
		normalize(histB, histB, 0, histImage.rows, NORM_MINMAX);
		normalize(histG, histG, 0, histImage.rows, NORM_MINMAX);
		normalize(histR, histR, 0, histImage.rows, NORM_MINMAX);
		//绘制直方图
		for (int i = 1; i < histSize;++i)
		{
			line(histImage, Point(bin_w*(i - 1), hist_h - histB.at<float>(i - 1)), Point(bin_w*(i), hist_h - histB.at<float>(i)), Scalar(255, 0, 0));
			line(histImage, Point(bin_w*(i - 1), hist_h - histG.at<float>(i - 1)), Point(bin_w*(i), hist_h - histG.at<float>(i)), Scalar(0, 255, 0));
			line(histImage, Point(bin_w*(i - 1), hist_h - histR.at<float>(i - 1)), Point(bin_w*(i), hist_h - histR.at<float>(i)), Scalar(0, 0, 255));
		}
		namedWindow(hist);
		imshow(hist, histImage);
	}
	return;
}
int main()
{
	string filename = "C:/Users/Administrator/Desktop/标准测试图片/dota/big32001.jpg";
	g_img = imread(filename, IMREAD_COLOR);
	if (g_img.empty())
	{
		return -1;
	}
	namedWindow(tile);
	setMouseCallback(tile, Mouse, NULL);//创建鼠标回调函数
	imshow(tile, g_img);
	waitKey(0);
  	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值