4. Explanation of the DM Code Recognition Routine#
1. Overview#
The Data Matrix code is a type of two-dimensional barcode widely used for identifying and tracking small products. It consists of small black and white squares arranged in a rectangular or square grid.
CanMV supports the OpenMV algorithm capable of recognizing Data Matrix codes. The relevant interface is find_datamatrices
.
2. Example#
This example sets the camera output to a 640x480 grayscale image and uses image.find_datamatrices
to recognize Data Matrix codes.
Tip
If the recognition success rate is low, try adjusting the camera’s mirror and flip settings.
# Data Matrix Example
import time
import math
import os
import gc
import sys
from media.sensor import *
from media.display import *
from media.media import *
# Define the width and height of the detection image
DETECT_WIDTH = 640
DETECT_HEIGHT = 480
sensor = None
try:
# Construct the Sensor object using default configuration
sensor = Sensor(width=DETECT_WIDTH, height=DETECT_HEIGHT)
# Reset the sensor
sensor.reset()
# Set output size and format
sensor.set_framesize(width=DETECT_WIDTH, height=DETECT_HEIGHT)
sensor.set_pixformat(Sensor.GRAYSCALE)
# Initialize display
Display.init(Display.VIRT, width=DETECT_WIDTH, height=DETECT_HEIGHT, fps=100)
# Initialize media manager
MediaManager.init()
# Start the sensor
sensor.run()
fps = time.clock()
while True:
fps.tick()
# Check if should exit
os.exitpoint()
img = sensor.snapshot()
for matrix in img.find_datamatrices():
# Draw a rectangle around the recognized Data Matrix code
img.draw_rectangle([v for v in matrix.rect()], color=(255, 0, 0))
print_args = (matrix.rows(), matrix.columns(), matrix.payload(), (180 * matrix.rotation()) / math.pi, fps.fps())
print("Matrix [%d:%d], Content \"%s\", Rotation %f (degrees), FPS %f" % print_args)
# Render the result to the screen
Display.show_image(img)
gc.collect()
except KeyboardInterrupt:
print("User stopped")
except BaseException as e:
print(f"Exception '{e}'")
finally:
# Stop the sensor
if isinstance(sensor, Sensor):
sensor.stop()
# Deinitialize the display
Display.deinit()
os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
time.sleep_ms(100)
# Release media buffers
MediaManager.deinit()
Code Explanation#
Import Modules: Import necessary libraries to use sensor, display, and media management functionalities.
Define Image Dimensions: Set the width and height of the detection image to 640x480.
Sensor Configuration: Create and configure the sensor object, setting the image output size and format (grayscale image).
Display Initialization: Configure the display output method, choosing IDE output.
Main Loop:
Capture images and check exit conditions.
Recognize Data Matrix codes in the image and draw a red rectangle around the codes.
Print detailed information about the Data Matrix codes, including the number of rows, columns, content, rotation angle, and frame rate.
Exception Handling: Capture user interruptions or other exceptions, ensuring the sensor stops properly and resources are released.
Tip
For specific interface definitions, please refer to find_datamatrices.