From 160879c100baca7caedc44786cc17de52c2a472d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AD=A6=E5=A3=AB=E9=A3=8E=E5=BA=A6=E7=9A=84=E7=89=9B?= <1085968073@qq.com> Date: Wed, 24 Jul 2024 20:29:13 +0800 Subject: [PATCH] Merge pull request #25807 from spdfghi:4.x Search in two directions when try to add new quad in addOuterQuad #25807 In ChessBoardDetector::addOuterQuad, previous code try to connect new quad with inner quad, if possible, but only search for one direction. I have made three test images, one is normal(a.jpg), one lossed an outer quad(b.jpg), and then i flipped it vertically(c.jpg). Only last one fails. I fixed it by check two directions and row/col. Here is the test code and images: ``` Mat img; vector corners; auto size = cv::Size(6, 6); img = imread("D:/tmp/a.jpg", 0); std::cout<ordered && - quad_prev->neighbors[i] && - quad_prev->neighbors[i]->ordered ) + // set row and col for next step check + switch (i) { - ChessBoardQuad* qn = quad_prev->neighbors[i]; - q.count = 2; - q.neighbors[prev_i] = qn; - qn->neighbors[next_i] = &q; - qn->count += 1; - // have to set exact corner - q.corners[prev_i] = qn->corners[next_i]; + case 0: + q.col = quad.col - 1; q.row = quad.row - 1; break; + case 1: + q.col = quad.col + 1; q.row = quad.row - 1; break; + case 2: + q.col = quad.col + 1; q.row = quad.row - 1; break; + case 3: + q.col = quad.col - 1; q.row = quad.row + 1; break; + } + + // now find other neighbor and add it, if possible + for (int k = 1; k <= 3; k += 2) + { + int next_i = (i + k) % 4; + int prev_i = (i + k + 2) % 4; + ChessBoardQuad* quad_prev = quad.neighbors[prev_i]; + if (quad_prev && + quad_prev->ordered && + quad_prev->neighbors[i] && + quad_prev->neighbors[i]->ordered && + std::abs(quad_prev->neighbors[i]->col - q.col) == 1 && + std::abs(quad_prev->neighbors[i]->row - q.row) == 1) + { + ChessBoardQuad* qn = quad_prev->neighbors[i]; + q.count = 2; + q.neighbors[prev_i] = qn; + qn->neighbors[next_i] = &q; + qn->count += 1; + // have to set exact corner + q.corners[prev_i] = qn->corners[next_i]; + } } } }