1.头文件
#pragma once
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
enum DiColor{RED = 0,BLUE = 1};
class ZhuangJia
{
public:
ZhuangJia();
//二值化
void erZhiHua(const Mat &src, Mat &dst, uchar yz);
//亮度调整
void liangDuTiaoZheng(const Mat &src, Mat &dst, double k, double b);
//寻找目标区域
vector<RotatedRect> xunZhaoJuXing(const Mat &img);
//拟合可能区域
vector<RotatedRect> niHeMuBiao(vector<RotatedRect> vr);
//寻找最佳目标区域
RotatedRect xunZhaoZuiJia(vector<RotatedRect> vr);
//画出目标区域
void huaChuMuBiao(Mat img, RotatedRect vr);
//计算距离,返回值越大,距离越大
int jiSuanjuLi(const Mat &imgroi, int &yuzhi);
public:
uchar huiDu;
uchar diColor;//地方颜色标志
int juLiYuZhi;
int imgwidth;
int imgheight;
int liangDu;
int jianCeBianChang;
Mat erZhiTu;
Mat imgG;//绿色通道图像
Mat imgD;//敌方颜色通道图像
Mat imgTemplate;
Mat imgTemplateSmall;
bool isFar;
};
2.源文件
#include "zhuangjia.hpp"
#ifndef DEBUG
//#define DEBUG
#endif
ZhuangJia::ZhuangJia()
{
huiDu = 210;
diColor = RED;
imgwidth = 640;
imgheight = 480;
juLiYuZhi = 15;
jianCeBianChang = 2;
isFar = false;
//读取模板图片
Mat img = imread("template.bmp");
vector<Mat> vimg;
split(img,vimg);
threshold(vimg[1],imgTemplate,210,255,THRESH_BINARY);
// imshow("aa",imgTemplate);
}
void ZhuangJia::erZhiHua(const Mat &src, Mat &dst, uchar yz)
{
vector<Mat> bgr;
Mat m;
//亮度调整
liangDuTiaoZheng(src,m,1,-120);
split(m, bgr);
dst.create(src.size(),CV_8UC1);
imgG = bgr[1];
imgD = diColor == RED ? bgr[2] : bgr[0];
//二值化
uchar *ptrg = imgG.data, *ptrd = imgD.data, *ptrer = dst.data;
const uchar *ptrend = imgG.data + imgG.rows*imgG.cols;
for(; ptrg != ptrend; ptrg++,ptrd++,ptrer++)
{
*ptrer = (*ptrd - *ptrg) > yz ? 255 : 0;
}
// imshow("huidu",dst);
}
void ZhuangJia::liangDuTiaoZheng(const Mat &src, Mat &dst, double k, double b)
{
liangDu = b;
dst.create(src.size(),src.typ