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; }
相关文章推荐
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域
- 【练习4.3】在图片上画矩形并高亮显示矩形区域、统计矩形区域中像素情况并绘制直方图
- Opencv 提取图像中的矩形区域
- 利用鼠标绘制矩形和截取图像的矩形区域并保存(OpenCV2.4.5)
- opencv鼠标绘制矩形和截取图像的矩形区域
- opencv-- 使用鼠标绘制矩形并截取和保存矩形区域图像
- OpenCV鼠标绘制矩形和截取图像的矩形区域
- OpenCV学习笔记(18):在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域
- 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域
- [good]opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- opencv提取旋转矩形区域的图像(将旋转矩形区域图像旋转成水平)
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域
- 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域
- 2.9 opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像