opencv 绘制矩形,提取矩形区域的直方图
发布日期:2021-11-07 18:53:24 浏览次数:2 分类:技术文章

本文共 2660 字,大约阅读时间需要 8 分钟。

#include 
#include
#include
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
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
(i - 1)), Point(bin_w*(i), hist_h - histB.at
(i)), Scalar(255, 0, 0)); line(histImage, Point(bin_w*(i - 1), hist_h - histG.at
(i - 1)), Point(bin_w*(i), hist_h - histG.at
(i)), Scalar(0, 255, 0)); line(histImage, Point(bin_w*(i - 1), hist_h - histR.at
(i - 1)), Point(bin_w*(i), hist_h - histR.at
(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;}

转载地址:https://blog.csdn.net/zhanggusheng/article/details/70189048 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:opencv 的几种边界
下一篇:opencv 创建鼠标消息的问题

发表评论

最新留言

很好
[***.229.124.182]2024年04月13日 13时40分52秒