Merge pull request #27876 from MaximSmolskiy:fix_charuco_board_pattern_in_generate_pattern.py

Fix charuco_board_pattern in generate_pattern.py #27876

### Pull Request Readiness Checklist

Fix #27871 

See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
      Patch to opencv_extra has the same branch name.
- [ ] The feature is well documented and sample code can be built with the project CMake
This commit is contained in:
Maxim Smolskiy 2025-10-13 09:09:56 +03:00 committed by GitHub
parent a74374d1ed
commit 514d362ad8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 29 additions and 5 deletions

View File

@ -207,12 +207,36 @@ class PatternMaker:
square = SVG("rect", x=x_pos+ch_ar_border, y=y_pos+ch_ar_border, width=self.aruco_marker_size, square = SVG("rect", x=x_pos+ch_ar_border, y=y_pos+ch_ar_border, width=self.aruco_marker_size,
height=self.aruco_marker_size, fill="black", stroke="none") height=self.aruco_marker_size, fill="black", stroke="none")
self.g.append(square) self.g.append(square)
# BUG: https://github.com/opencv/opencv/issues/27871
# The loop bellow merges white squares horizontally and vertically to exclude visible grid on the final pattern
for x_ in range(len(img_mark[0])): for x_ in range(len(img_mark[0])):
for y_ in range(len(img_mark)): y_ = 0
if (img_mark[y_][x_] != 0): while y_ < len(img_mark):
square = SVG("rect", x=x_pos+ch_ar_border+(x_)*side, y=y_pos+ch_ar_border+(y_)*side, width=side, y_start = y_
height=side, fill="white", stroke="white", stroke_width = spacing*0.01) while y_ < len(img_mark) and img_mark[y_][x_] != 0:
self.g.append(square) y_ += 1
if y_ > y_start:
rect = SVG("rect", x=x_pos+ch_ar_border+(x_)*side, y=y_pos+ch_ar_border+(y_start)*side, width=side,
height=(y_ - y_start)*side, fill="white", stroke="none")
self.g.append(rect)
y_ += 1
for y_ in range(len(img_mark)):
x_ = 0
while x_ < len(img_mark[0]):
x_start = x_
while x_ < len(img_mark[0]) and img_mark[y_][x_] != 0:
x_ += 1
if x_ > x_start:
rect = SVG("rect", x=x_pos+ch_ar_border+(x_start)*side, y=y_pos+ch_ar_border+(y_)*side, width=(x_-x_start)*side,
height=side, fill="white", stroke="none")
self.g.append(rect)
x_ += 1
def save(self): def save(self):
c = canvas(self.g, width="%d%s" % (self.width, self.units), height="%d%s" % (self.height, self.units), c = canvas(self.g, width="%d%s" % (self.width, self.units), height="%d%s" % (self.height, self.units),

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 42 KiB