自定义检测五角星算子
本算子通过自定义多项式拟合的参数来确定图像中的图形形状
#include "Ptest.h"
#include <QRect>
#include<opencv2/opencv.hpp>
void drawpp(cv::Mat &result, cv::Mat &img2)
{
for (int i = 0; i < result.rows; i++)
{
if (i == result.rows - 1)
{
cv::Vec2i point1 = result.at<cv::Vec2i>(i);
cv::Vec2i point2 = result.at<cv::Vec2i>(0);
line(img2, point1, point2, cv::Scalar(0, 0, 255), 2, 8, 0);
break;
}
cv::Vec2i point1 = result.at<cv::Vec2i>(i);
cv::Vec2i point2 = result.at<cv::Vec2i>(i + 1);
line(img2, point1, point2, cv::Scalar(0, 0, 255), 2, 8, 0);
}
}
int a_fiveStar(aAlgoFunc &func)
{
std::map<std::string, aParam> lstParams = func.lstParams;///算法函数参数
std::map<std::string, inputParamS> inputsMap = func.lstInputs;///输入
//再定义一个参数,用以定义函数的
cv::Mat srcImg = inputsMap["src"].img.clone();///图片特殊取出
int param1 = lstParams["param1"].varParam.toInt();
int param2 = lstParams["param2"].varParam.toInt();
int param3 = lstParams["param3"].varParam.toInt();
//Mat srcImg = imread("C:\\Users\\rsopto\\Desktop\\img_practice\\test1.png");
imshow("src", srcImg);
//灰度图,平滑滤波,二值化
cv::Mat gray, binary;
cvtColor(srcImg, gray, cv::COLOR_RGB2GRAY);
GaussianBlur(gray, gray, cv::Size(13, 13), 4, 4);
threshold(gray, binary, 60, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
//轮廓发现与绘制
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarcy;
findContours(binary, contours, hierarcy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE, cv::Point());
//绘制多边形
for (int i = 0; i < contours.size(); i++)
{
//轮廓中心
cv::RotatedRect rrect = cv::minAreaRect(contours[i]);
cv::Point2f center = rrect.center;
cv::Mat result;
cv::approxPolyDP(contours[i], result,param3 , true); //用以输入多边形拟合的精度
drawpp(result, srcImg);
//cout << result.rows << endl;
if (result.rows > param1 && result.rows < param2)
{
cv::putText(srcImg, "five-pointed star", center, 0, 0.5, cv::Scalar(0, 255, 0), 1, 4);
}
}
func.lstOutputs["dst"].img = srcImg.clone();///图片特殊取出
return 0;
}
std::map<std::string, funStruct> Ptest::getDescription()
{
std::map<std::string, funStruct> map;
aAlgoFunc afun;
afun.funcName = "a_fiveStar"; ///函数名,需要与定义一样!
afun.displayName = "检测五角星"; ///函数的显示名
afun.info = "本算子可以检测出图像中的五角星";///函数的详细说明
std::map<std::string, aParam> paraMap;
makeParam(paraMap, "param1", "输入多边形拟合的参数", "这个参数用以表示多边形边数的两个阈值,参数1表示下限", QVariant::Int, 9);///参数名,显示名,参数详细说明,参数类型
makeParam(paraMap, "param2", "多边形顶点判断的条件阈值", "这个条件可以用以判断是否为五角星,同时,不同的条件也可以判断出不同的形状,如圆 三角形等", QVariant::Int, 15);
makeParam(paraMap, "param3", "多边形顶点判断的条件阈值", "这个条件可以用以判断是否为五角星,同时,不同的条件也可以判断出不同的形状,如圆 三角形等", QVariant::Int, 15);
std::map<std::string, inputParamS> lstInputs;
makeInputs(lstInputs, "src", "输入图", "要处理的图片", QVariant::Image);
std::map<std::string, outputParamS> lstOutputs;
makeOutputs(lstOutputs, afun.displayName, "dst", "标定好五角星的图片", "结果图片", QVariant::Image);
afun.lstParams = paraMap;
afun.lstInputs = lstInputs;
afun.lstOutputs = lstOutputs;
afun.type = typeChangyong;
funStruct funS;
funS.funDescription = afun;
funS.funPtr = a_fiveStar;
map[afun.funcName] = funS;
return map;
}