这段时间在做多边形检测区域的缩放,为了保证检测的准确性,需要对检测区域进行合理的缩放。而检测区域的标记通过鼠标点击窗口,获取多边形的顶点位置,连接顶点获取。代码写的比较坑,但是这是自己的心血,接下来需要在这个思路的基础上优化代码。继续学习……
已知:
1.多边形各顶点及各边上的点坐标,如pointArray[0] = Point(200,200);pointArray[1] = Point(400,200);pointArray[2] = Point(600,200);pointArray[3] = Point(800,200);
pointArray[4] = Point(850,250); pointArray[5] = Point(900,300);pointArray[6] = Point(800,350); pointArray[7] = Point(800,400);pointArray[8]= Point(200,400);pointArray[9] = Point(200,300);红色标记的点才为多变行的顶点,其他点是操作用户在画检测区域时人为带入的干扰因素。
2.多边形各边按照对应垂线的平移量shift
条件:
多边形在缩放的过程中不能发生形变
求解:
按照shift平移量,获取多边形缩放后的顶点坐标位置
效果:
原始图片:图中没有凸显标记出边缘上的点
效果图:
图中不同的线条表示缩放的不同尺寸,这里是循环显示了初始平移量shift后shift++后的所有缩放图形。
蔚蓝色的图形表示可以缩放的最小图片,在缩放,多边形将会发生形变。
实现:
.h文件
#pragma once
#include <opencv2\opencv.hpp>
using namespace cv;
bool reduceScale(Point* vertexCoordinateSet, int* numSrcVertex,unsigned int scaleDown);//获取缩放后的多边形的各顶点
bool computeSlope(Point *pointSet, int n, float* slope);//计算各边的斜率(考虑了垂直和水平的情况)
bool extractPoint(Point *srcInputPoint, int *numVertex);//去除非顶点的坐标,保留真正的顶点坐标
cpp文件
#include "polygonScaleZoom.h"
bool reduceScale(Point* vertexCoordinateSet, int* numSrcVertex,unsigned int scaleDown)
{
//使用范围:凸多边形
//vertexCoordinateSet:表示输入多边形顶点坐标集(需要按照顺时针或者逆时针顺序排列)
//numVertex:表示多边形顶点个数
//scaleDown:表示多边形每条边向内平行移动的像素个数
int &numVertex = *numSrcVertex;
if (!vertexCoordinateSet || numVertex <3 || !scaleDown)
{
return false;
}
bool statusExtract;
statusExtract = extractPoint(vertexCoordinateSet,&numVertex);
if (!statusExtract)
{
return false;
}
Point polyCenter; //多边形中心点:表示多边形所有顶点的均值
float *straightSlope = new float[numVertex]();//直线的斜率
int *signVerticalSlope = new int[numVertex]();//垂直方向标记位,1表示与x轴垂直,0则相反
int *signHorizontalSlope = new i