您的位置:首页 > 运维架构

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

2017-04-16 00:20 344 查看
#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;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  直方图 图像处理