/*
功能:读入图片,选择合适的ROI区域进行反向投影 (based on opencv4.0 api)
日期:2019-1-16
作者:william jiang
*/
#include <vector>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>
using namespace cv;
using namespace std;
Point pt1, pt2;
int state;
bool flag, ready;
// 鼠标左键点击回调函数,用于返回点击处坐标
void mouseCaller(int event, int x, int y, int flags, void* data) {
Point* pt = reinterpret_cast<Point*>(data);
switch (event) {
case EVENT_LBUTTONDOWN: {
*pt = Point(x, y);
flag = true;
} break;
}
}
int main() {
namedWindow("Input", WINDOW_AUTOSIZE);
namedWindow("ROI", WINDOW_AUTOSIZE);
namedWindow("backProj", WINDOW_AUTOSIZE);
Mat img = imread("../../common_data/hand.jpg"); //设置合适的图片路径
if (img.empty()) { cout << "Error: read image fails!\n"; return -1; }
imshow("Input", img);
// 获取原始图像的直方图(非必须)
Mat hsv;
cvtColor(img, hsv, COLOR_BGR2HSV);
int hbins = 30, sbins = 32;
int histSize[] = { hbins, sbins };
float hranges[] = { 0, 180 };
float sranges[] = { 0, 256 };
const float* ranges[] = { hranges, sranges };
MatND hist;
int channels[] = { 0, 1 };
calcHist(&hsv, 1, channels, Mat(), hist, 2, histSize, ranges, true, false);
// 获取鼠标按键,生成合适的ROI区域
state = 0;
flag = false;
ready = false;
Point pos;
setMouseCallback("Input", mouseCaller, &pos);
while (true){
if (27 == waitKey(1)) break; // Esc键退出
if (flag) {
switch (state) {
case 0:
{
pt1 = pos;
state = 1;
flag = false;
cout << "enter state 0 \n";
break;
}
case 1:
{
pt2 = pos;
state = 0;
flag = false;
cout << "enter state 1 \n";
rectangle(img, Rect(pt1, pt2), Scalar(0, 0, 0xff), 1);
imshow("Input", img);
ready = true;
break;
}
}
}
if (ready) { // 处理生成反向投影
cout << "enter ready state \n";
Mat roi = hsv(Rect(pt1,pt2));
imshow("ROI", roi);
Mat roiHist;
calcHist(&roi, 1, channels, Mat(), roiHist, 2, histSize, ranges, true, false);
normalize(roiHist, roiHist, 0, 255, NORM_MINMAX, -1,Mat());
Mat backProjImg;
calcBackProject(&hsv, 1, channels, roiHist, backProjImg, ranges, 1, true);
imshow("backProj", backProjImg);
ready = false;
}
}
destroyAllWindows();
return 0;
}
图片直方图应用-反向投影实例
最新推荐文章于 2023-09-03 10:57:47 发布