opencv模板匹配 根据位置加权 java版

2022-11-16 02:09

目的:答题卡的四周定位点识别,就是黑块块,但是实际生产中会将学生涂改的黑团团识别上。

方案:定位点预设位置在四周,做一个坐标加权,定位点的标准位置加权,越偏离标准点的坐标降权。

Imgproc.matchTemplate(submat, blackRectMat, destination, Imgproc.TM_CCORR_NORMED);

int rows = destination.rows();
int cols = destination.cols();

double thinkX = point.x-x1;
double thinkY = point.y-y1;
double[] doubles = null;
double len = 0;

for (int ri = 0; ri < rows; ri++)
{
    for (int j = 0; j < cols; j++)
    {
       doubles = destination.get(ri, j);
       // 根据距离 加权,偏离预定值越远的 减权,可能是学生涂的一个块
       thinkX = point.x-x1;
       thinkY = point.y-y1;
       len = Math.sqrt(Math.pow(thinkX - j,2) + Math.pow(thinkY - ri,2));
       // log.debug("sx:{},sy:{},x:{},y:{},leng:{}:{}",thinkX,thinkY,j,ri,len,doubles[0]);
       // TM_CCORR_NORMED模式是取最大值,减去加权的值,0.001为调试多次取得的值
       doubles[0] = doubles[0] - len*0.001;
       destination.put(ri, j, doubles);
    }
}

Core.MinMaxLocResult minmaxLoc1 = Core.minMaxLoc(destination);
double resultValue = minmaxLoc1.maxVal;
Point resultLoc = minmaxLoc1.maxLoc;


历遍识别后的点位,计算每个点距离标准点的位置,将识别后的数值减去距离*0.001,最后再获取最大值坐标点。

加权后,和不加权处理的归一化图片对比如下

# opencv