1+ from dls_util .image .image import Image
12from .locate import Locator
2- from .read import DatamatrixSizeTable
3- from .read import DatamatrixReaderError , ReedSolomonError
4- from .read import DatamatrixBitReader
5- from .read import DatamatrixByteExtractor
6- from .read import ReedSolomonDecoder
7- from .read import DatamatrixByteInterpreter
83from pylibdmtx .pylibdmtx import decode
4+ import cv2
95
106
117# We predict the location of the center of each square (pixel/bit) in the datamatrix based on the
@@ -29,10 +25,7 @@ class DataMatrix:
2925 DEFAULT_SIZE = 14
3026 DEFAULT_SIDE_SIZES = [12 , 14 ]
3127
32- _w = 0.25
33- DIAG_WIGGLES = [[0 , 0 ], [_w , _w ], [- _w , - _w ], [_w , - _w ], [- _w , _w ]]
34-
35- def __init__ (self , finder_pattern , image ):
28+ def __init__ (self , finder_pattern ):
3629 """ Initialize the DataMatrix object with its finder pattern location in an image. To actually
3730 interpret the DataMatrix, the perform_read() function must be called, which will attempt to read
3831 the DM from the supplied image.
@@ -42,7 +35,6 @@ def __init__(self, finder_pattern, image):
4235 error correction bytes).
4336 """
4437 self ._finder_pattern = finder_pattern
45- self ._image = image .img
4638 self ._matrix_sizes = [self .DEFAULT_SIZE ]
4739
4840 self ._data = None
@@ -54,14 +46,15 @@ def __init__(self, finder_pattern, image):
5446 def set_matrix_sizes (self , matrix_sizes ):
5547 self ._matrix_sizes = [int (v ) for v in matrix_sizes ]
5648
57- def perform_read (self , offsets = wiggle_offsets , force_read = False ):
49+ def perform_read (self , image , force_read = False ):
5850 """ Attempt to read the DataMatrix from the image supplied in the constructor at the position
5951 given by the finder pattern. This is not performed automatically upon construction because the
6052 read operation is relatively expensive and might not always be needed.
6153 """
6254 if not self ._is_read_performed or force_read :
6355 # Read the data contained in the barcode from the image
64- self ._read (self ._image , offsets )
56+ sub , _ = image .sub_image (self .center (), 1.2 * self .radius ())
57+ self ._read (sub .img )
6558 self ._is_read_performed = True
6659
6760 def is_read (self ):
@@ -91,7 +84,7 @@ def data(self):
9184 return self ._data
9285 else :
9386 return ''
94-
87+
9588 def bounds (self ):
9689 """ A circle which bounds the data matrix (center, radius). """
9790 return self ._finder_pattern .bounds ()
@@ -103,65 +96,31 @@ def center(self):
10396 def radius (self ):
10497 """ The radius (center-to-corner distance) of the DataMatrix finder pattern. """
10598 return self ._finder_pattern .radius
106-
107- def _read (self , gray_image , offsets ):
108- if self .radius () >= 0.2 * (gray_image .shape [0 ]):
109- self ._read_single (gray_image )
110- else :
111- self ._read_old (gray_image , offsets )
112-
113- def _read_old (self , gray_image , offsets ):
99+
100+ def _read (self , gray_image ):
114101 """ From the supplied grayscale image, attempt to read the barcode at the location
115102 given by the datamatrix finder pattern.
116103 """
117- for matrix_size in self ._matrix_sizes :
118- bit_reader = DatamatrixBitReader (matrix_size )
119- extractor = DatamatrixByteExtractor ()
120- decoder = ReedSolomonDecoder ()
121- interpreter = DatamatrixByteInterpreter ()
122-
123- message_length = DatamatrixSizeTable .num_data_bytes (matrix_size )
124-
125- # Try a few different small offsets for the sample positions until we find one that works
126- for offset in offsets :
127- # Read the bit array at the target location (with offset)
128- # If the bit array is valid, decode it and create a datamatrix object
129- try :
130- bit_array = bit_reader .read_bit_array (self ._finder_pattern , offset , gray_image )
131- encoded_bytes = extractor .extract_bytes (bit_array )
132- decoded_bytes = decoder .decode (encoded_bytes , message_length )
133- data = interpreter .interpret_bytes (decoded_bytes )
134-
135- self ._data = data
136- self ._read_ok = True
137- self ._error_message = ""
138- break
139- except (DatamatrixReaderError , ReedSolomonError ) as ex :
140- self ._read_ok = False
141- self ._error_message = str (ex )
142-
143- self ._damaged_symbol = not self ._read_ok
144-
145- if self ._read_ok :
146- break
147-
148- def _read_single (self , gray_image ):
149104 try :
150- result = decode (gray_image )
105+
106+ cv2 .imshow ("Erode" , gray_image )
107+ cv2 .waitKey (0 )
108+ result = decode (gray_image , max_count = 1 )
151109 if len (result ) > 0 :
152110 d = result [0 ].data
153111 decoded = d .decode ('UTF-8' )
154112 new_line_removed = decoded .replace ("\n " ,"" )
155113 self ._data = new_line_removed
156114 self ._read_ok = True
157- self ._is_read_performed = True
158115 self ._error_message = ""
159116 else :
160117 self ._read_ok = False
161118 except (Exception ) as ex :
162119 self ._read_ok = False
163120 self ._error_message = str (ex )
164121
122+ self ._damaged_symbol = not self ._read_ok
123+
165124 def draw (self , img , color ):
166125 """ Draw the lines of the finder pattern on the specified image. """
167126 fp = self ._finder_pattern
@@ -174,7 +133,7 @@ def locate_all_barcodes_in_image(grayscale_img, matrix_sizes=[DEFAULT_SIZE]):
174133 """
175134 locator = Locator ()
176135 finder_patterns = locator .locate_shallow (grayscale_img )
177- unread_barcodes = DataMatrix ._fps_to_barcodes (grayscale_img , finder_patterns , matrix_sizes )
136+ unread_barcodes = DataMatrix ._fps_to_barcodes (finder_patterns , matrix_sizes )
178137 return unread_barcodes
179138
180139 @staticmethod
@@ -185,12 +144,12 @@ def locate_all_barcodes_in_image_deep(grayscale_img, matrix_sizes=[DEFAULT_SIDE_
185144 locator = Locator ()
186145 locator .set_median_radius_tolerance (0.2 )
187146 finder_patterns = locator .locate_deep (grayscale_img , expected_radius = None , filter_overlap = True )
188- unread_barcodes = DataMatrix ._fps_to_barcodes (grayscale_img , finder_patterns , matrix_sizes )
147+ unread_barcodes = DataMatrix ._fps_to_barcodes (finder_patterns , matrix_sizes )
189148 return unread_barcodes
190149
191150 @staticmethod
192- def _fps_to_barcodes (grayscale_img , finder_patterns , matrix_sizes ):
193- unread_barcodes = [DataMatrix (fp , grayscale_img ) for fp in finder_patterns ]
151+ def _fps_to_barcodes (finder_patterns , matrix_sizes ):
152+ unread_barcodes = [DataMatrix (fp ) for fp in finder_patterns ]
194153 for bc in unread_barcodes :
195154 bc .set_matrix_sizes (matrix_sizes )
196155 return list (unread_barcodes )
0 commit comments