opencv3 计算反向投影-鼠标事件
2015-11-05 22:59
337 查看
#include<opencv2/opencv.hpp> #include<iostream> #include<vector> using namespace cv; using namespace std; vector<Mat> modeHImage; Mat findImage; int binValue = 254; Mat modeImage; bool g_bDrawingBox = false; Rect g_rectangle; RNG &g_rng = theRNG(); Mat modeROIImage; Point startPoint; Mat tempImage; void onMouse(int event, int x, int y, int flag, void *param) { Mat &img = *(cv::Mat*)param; switch (event) { //移动鼠标的时候 case CV_EVENT_MOUSEMOVE: { if (g_bDrawingBox) { g_rectangle.width = x - g_rectangle.x; g_rectangle.height = y - g_rectangle.y; tempImage.copyTo(modeImage); rectangle(modeImage, startPoint , Point(startPoint.x + g_rectangle.width, startPoint.y + g_rectangle.height) , Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255))); imshow("【模版图像】", modeImage); } } break; //点击鼠标左键时 case CV_EVENT_LBUTTONDOWN: { g_bDrawingBox = true; g_rectangle = Rect(x, y, 0, 0); startPoint = Point(x, y); } break; //松开鼠标左键时 case CV_EVENT_LBUTTONUP: { g_bDrawingBox = false; modeROIImage = modeImage(Rect(startPoint.x, startPoint.y, x - startPoint.x, y - startPoint.y)); imshow("【感兴趣区域】", modeROIImage); tempImage.copyTo(modeImage); //计算模版图像的直方图 ////首先得得到HSV空间的H通道,所以先进行图像空间的转换 //Mat modeHsvImage; //cvtColor(modeROIImage, modeHsvImage, CV_BGR2HSV); //split(modeHsvImage, modeHImage); //计算 得到的H通道的直方图 MatND modeHist; int channels[] = { 0, 1, 2 }; int histSize[] = { 256, 256, 256 }; float BRanges[] = { 0, 255 }; float GRanges[] = { 0, 255 }; float RRanges[] = { 0, 255 }; const float *ranges[] = { BRanges, GRanges, RRanges }; calcHist(&modeROIImage, 1, channels, Mat(), modeHist, 3, histSize, ranges, true, false); /*normalize(modeHist, modeHist, 1.0);*/ //利用得到的 模版图像的直方图 计算需要查找的图像的反向投影 Mat backImage; backImage.create(findImage.size(), CV_8UC1); backImage = Scalar::all(0); calcBackProject(&findImage, 1, channels, modeHist, backImage, ranges, 255.0); imshow("【反向投影计算得到的图像】", backImage); } break; } } int main() { modeImage = imread("green2.jpg"); modeImage.copyTo(tempImage); findImage = imread("green1.jpg"); namedWindow("【模版图像】", 0); imshow("【模版图像】", modeImage); namedWindow("【查询图像】", 0); imshow("【查询图像】", findImage); ////对需要查询的图形进行颜色减缩操作 //Mat_<Vec3b>::iterator it = findImage.begin<Vec3b>(); //Mat_<Vec3b>::iterator itend = findImage.end<Vec3b>(); //while (it != itend) //{ // (*it)[0] = (*it)[0] / 64 * 64 + 64 / 2; // (*it)[1] = (*it)[1] / 64 * 64 + 64 / 2; // (*it)[2] = (*it)[2] / 64 * 64 + 64 / 2; // ++it; //} setMouseCallback("【模版图像】", onMouse, (void *)&modeImage); modeROIImage.create(modeImage.size(), modeImage.type()); modeImage.copyTo(modeROIImage); char key; while (1) { key = waitKey(1); if (key == 27) break; } return 0; }
相关文章推荐
- opencv3 计算反向投影-calcBackProject函数-滚动条
- linux c/c++ 后台开发常用算法之:md5算法c++版实现
- nginx不浏览直接下载文件
- linux用户的增加
- opencv3 计算二维直方图-H-S直方图
- opencv3 绘制一维直方图-灰度直方图的绘制-柱状图
- opencv3 绘制一维直方图-灰度直方图的绘制
- opencv3 绘制二维直方图-H-S直方图
- opencv3 绘制BGR三色直方图-柱状图
- opencv3 绘制BGR三色直方图
- opencv3 对比直方图-compareHist函数
- 提升vps网速
- Nginx之location 匹配规则详解
- nginx下载文件 apk ios
- nginx的root和alias指令的区别
- centos查看安装的软件包和软件包数量
- [笔记]架构探险-从零开始写JavaWeb框架-2.2. 之使框架具有aop特性-干货,让框架支持事务处理
- linux:shell 编程 条件判断 以及 判断条件
- WPF MVVM 架构 Step By Step(1)(介绍)
- centos6.6配置LNMP(linux+nginx+mysql+php)