halcon 条形码、二维码识别、opencv识别

一、条形码

函数介绍

create_bar_code_model

cs 复制代码
* 1.创建条码读取器的模板
* 参数一:通用参数的名称,针对条形码模型进行调整。默认值为空
* 参数二:针对条形码模型进行调整
* 参数三:条形码模型的句柄。
create_bar_code_model ([], [], BarCodeHandle)

set_bar_code_param

cpp 复制代码
* 参数一:条形码模型的句柄。
* 参数二:通用参数的名称,针对查找和解码条形码进行了调整
* 参数三:通用参数的值
set_bar_code_param (BarCodeHandle, 'stop_after_result_num', 1)

find_bar_code

cpp 复制代码
* 3.在图像中读取条码数据和数据区域
* 参数一:要查找的图片
* 参数二:条码数据区域
* 参数三:条码模板句柄
* 参数四:条码类型
* 参数五:读取结果
find_bar_code (ImageReduced2, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)

效果

代码

cs 复制代码
* 1.创建条码读取器的模板
* 参数一:通用参数的名称,针对条形码模型进行调整。默认值为空
* 参数二:针对条形码模型进行调整
* 参数三:条形码模型的句柄。
create_bar_code_model ([], [], BarCodeHandle)

dev_set_color ('green')
dev_set_draw ('margin')

* 2.配置解码方式
* 参数一:条形码模型的句柄。
* 参数二:通用参数的名称,针对查找和解码条形码进行了调整
* 参数三:通用参数的值
set_bar_code_param (BarCodeHandle, 'stop_after_result_num', 1)
read_image (Image, 'D:/workplace/字符识别/Image_20250114144355733.bmp')
gen_rectangle2 (ROI_0, 2704.8, 2530.15, rad(0.89529), 882.925, 59.4154)
reduce_domain (Image, ROI_0, ImageReduced2)

* 用于将显示窗口的大小调整到适合图像大小的尺寸。
dev_resize_window_fit_image (ImageReduced2, 0, 0, -1, -1)

* 3.在图像中读取条码数据和数据区域
* 参数一:要查找的图片
* 参数二:条码数据区域
* 参数三:条码模板句柄
* 参数四:条码类型
* 参数五:读取结果
find_bar_code (ImageReduced2, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)
area_center (SymbolRegions, Area, Row, Column)

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)
dev_display (SymbolRegions)
disp_message (WindowHandle, DecodedDataStrings, 'image', Row+200, Column-500, 'black', 'true')

二、二维码

函数介绍:

create_data_code_2d_model

cs 复制代码
 *创建二维码模型
    * 创建二维码模型
    * 参数一:二维码类型
    * 参数二:通用参数的名称 针对二维数据代码模型进行了调整。
    * 参数三:针对二维数据代码模型进行了调整。
    * 参数四:数据代码模型的句柄。
    create_data_code_2d_model (_codeMode[Index1], 'default_parameters', 'maximum_recognition', DataCodeHandle)

find_data_code_2d

cs 复制代码
    *检测二维码,最多可以检测到10个
    * 查找图形中二维码,并获取信息
    * 参数一:图片
    * 参数二:围绕成功解码数据的 XLD 轮廓 代码符号。
    * 参数三:二维码模型的句柄。
    * 参数四:参数的名称 控制操作员的行为。
    * 参数五:可选泛型参数的值。
    * 参数六:所有成功解码的二维数据代码的句柄 符号。
    * 参数七:所有检测到的二维数据代码的解码数据字符串 图像中的符号。
    find_data_code_2d (ImageEmphasize, SymbolXLDs, DataCodeHandle, 'stop_after_result_num', 10, ResultHandles, \
                       DecodedDataStrings)
    

效果1:

效果2

代码

cs 复制代码
* 二维码读取
read_image (Image, 'C:/Users/Albert/Desktop/qr/2.bmp')
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
*创建二维码类型列表
_codeMode:=['Aztec Code', 'Data Matrix ECC 200', 'GS1 Aztec Code', 'GS1 DataMatrix', \
            'GS1 QR Code', 'Micro QR Code', 'PDF417', 'QR Code']
*图像放大1.5倍
zoom_image_factor (Image, ImageZoomed, 1.5, 1.5, 'constant')
*图像锐化
emphasize (ImageZoomed, ImageEmphasize, 20, 20, 1)
*遍历二维码类型列表
for Index1 := 0 to |_codeMode| by 1
    *创建二维码模型
    * 创建二维码模型
    * 参数一:二维码类型
    * 参数二:通用参数的名称 针对二维数据代码模型进行了调整。
    * 参数三:针对二维数据代码模型进行了调整。
    * 参数四:数据代码模型的句柄。
    create_data_code_2d_model (_codeMode[Index1], 'default_parameters', 'maximum_recognition', DataCodeHandle)
    *设置超时500ms
    set_data_code_2d_param (DataCodeHandle, 'timeout', 500)
    *检测二维码,最多可以检测到10个
    * 查找图形中二维码,并获取信息
    * 参数一:图片
    * 参数二:围绕成功解码数据的 XLD 轮廓 代码符号。
    * 参数三:二维码模型的句柄。
    * 参数四:参数的名称 控制操作员的行为。
    * 参数五:可选泛型参数的值。
    * 参数六:所有成功解码的二维数据代码的句柄 符号。
    * 参数七:所有检测到的二维数据代码的解码数据字符串 图像中的符号。
    find_data_code_2d (ImageEmphasize, SymbolXLDs, DataCodeHandle, 'stop_after_result_num', 10, ResultHandles, \
                       DecodedDataStrings)
    
    *获取当前图像的二维码类型
    code_type := _codeMode[Index1]
    *如果检测到图像有二维码,就显示在窗体上
    if (|DecodedDataStrings| > 0)
        disp_message (WindowHandle, code_type+':'+DecodedDataStrings, 'window', 12, 12, 'black', 'true')
    endif
endfor

dev_clear_window ()

三、csharpopencv 识别二维码

C#中生成二维码(QR码)与读取二维码内容_c#将字符串生成二维码图片-CSDN博客

实用主义,完全是按照上面这位老哥抄的

gitee如下:

OCRQR: 有百度的飞浆 C# opencv、以及其他开源软件的集合

四、全部代码

cpp 复制代码
* 1.创建条码读取器的模板
* 参数一:通用参数的名称,针对条形码模型进行调整。默认值为空
* 参数二:针对条形码模型进行调整
* 参数三:条形码模型的句柄。
create_bar_code_model ([], [], BarCodeHandle)

dev_set_color ('green')
dev_set_draw ('margin')

* 2.配置解码方式
* 参数一:条形码模型的句柄。
* 参数二:通用参数的名称,针对查找和解码条形码进行了调整
* 参数三:通用参数的值
set_bar_code_param (BarCodeHandle, 'stop_after_result_num', 1)
read_image (Image, 'D:/workplace/字符识别/Image_20250114144355733.bmp')
gen_rectangle2 (ROI_0, 2704.8, 2530.15, rad(0.89529), 882.925, 59.4154)
reduce_domain (Image, ROI_0, ImageReduced2)

* 用于将显示窗口的大小调整到适合图像大小的尺寸。
dev_resize_window_fit_image (ImageReduced2, 0, 0, -1, -1)

* 3.在图像中读取条码数据和数据区域
* 参数一:要查找的图片
* 参数二:条码数据区域
* 参数三:条码模板句柄
* 参数四:条码类型
* 参数五:读取结果
find_bar_code (ImageReduced2, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)
area_center (SymbolRegions, Area, Row, Column)

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)
dev_display (SymbolRegions)
disp_message (WindowHandle, DecodedDataStrings, 'image', Row+200, Column-500, 'black', 'true')

* 4.使用完毕,删除条码匹配模板











read_image (Image1111, 'D:/workplace/字符识别/1111.jpg')
rgb1_to_gray (Image1111, GrayImage)
gen_rectangle1 (ROI_0, 76.0361, 119.731, 257.755, 779.377)
reduce_domain (GrayImage, ROI_0, ImageReduced)
threshold (ImageReduced, Region, 0, 155)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ['area','contlength'], 'and', [490.84,114.53], [50000,2051.7])
sort_region (SelectedRegions, SortedRegions, 'first_point', 'true', 'row')
read_ocr_class_mlp ('Document_0-9A-Z_NoRej.omc', OCRHandle)
do_ocr_multi_class_mlp (SortedRegions, ImageReduced, OCRHandle, Class, Confidence)



*汉字识别
read_image (Image22, 'D:/workplace/字符识别/22.png')
rgb1_to_gray (Image22, GrayImage1)
gen_rectangle1 (ROI_0, 21.3781, 182.366, 148.383, 1159.65)
reduce_domain (GrayImage1, ROI_0, ImageReduced1)
threshold (ImageReduced1, Region1, 128, 255)
closing_circle (Region1, RegionClosing, 3.5)
connection (RegionClosing, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 150, 99999)
sort_region (SelectedRegions1, SortedRegions1, 'first_point', 'true', 'column')
dev_display (ImageReduced1)
words:=['国','外','电','子','与','通','信','教','材','系','列']
for Index := 1 to |words| by 1
    * 按顺序拿到单个字符
    select_obj (SortedRegions1, obj, Index)
    append_ocr_trainf (obj, ImageReduced1, words[Index-1], 'D:/workplace/字符识别/trainChinese.trf')
endfor


*读取训练文件
read_ocr_trainf_names ('D:/workplace/字符识别/trainChinese.trf', CharacterNames, CharacterCount)
*创建模型
create_ocr_class_mlp (8, 10, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle1)

* 训练模型
trainf_ocr_class_mlp (OCRHandle1, 'D:/workplace/字符识别/trainChinese.trf', 200, 1, 0.01, Error, ErrorLog)

*识别:
do_ocr_multi_class_mlp (SortedRegions1, ImageReduced1, OCRHandle1, Class1, Confidence1)







* 二维码读取
read_image (Image, 'C:/Users/Albert/Desktop/qr/1.jpg')
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
*创建二维码类型列表
_codeMode:=['Aztec Code', 'Data Matrix ECC 200', 'GS1 Aztec Code', 'GS1 DataMatrix', \
            'GS1 QR Code', 'Micro QR Code', 'PDF417', 'QR Code']
*图像放大1.5倍
zoom_image_factor (Image, ImageZoomed, 1.5, 1.5, 'constant')
*图像锐化
emphasize (ImageZoomed, ImageEmphasize, 20, 20, 1)
*遍历二维码类型列表
for Index1 := 0 to |_codeMode| by 1
    *创建二维码模型
    * 创建二维码模型
    * 参数一:二维码类型
    * 参数二:通用参数的名称 针对二维数据代码模型进行了调整。
    * 参数三:针对二维数据代码模型进行了调整。
    * 参数四:数据代码模型的句柄。
    create_data_code_2d_model (_codeMode[Index1], 'default_parameters', 'maximum_recognition', DataCodeHandle)
    *设置超时500ms
    set_data_code_2d_param (DataCodeHandle, 'timeout', 500)
    *检测二维码,最多可以检测到10个
    * 查找图形中二维码,并获取信息
    * 参数一:图片
    * 参数二:围绕成功解码数据的 XLD 轮廓 代码符号。
    * 参数三:二维码模型的句柄。
    * 参数四:参数的名称 控制操作员的行为。
    * 参数五:可选泛型参数的值。
    * 参数六:所有成功解码的二维数据代码的句柄 符号。
    * 参数七:所有检测到的二维数据代码的解码数据字符串 图像中的符号。
    find_data_code_2d (ImageEmphasize, SymbolXLDs, DataCodeHandle, 'stop_after_result_num', 10, ResultHandles, \
                       DecodedDataStrings)
    
    *获取当前图像的二维码类型
    code_type := _codeMode[Index1]
    *如果检测到图像有二维码,就显示在窗体上
    if (|DecodedDataStrings| > 0)
        disp_message (WindowHandle, code_type+':'+DecodedDataStrings, 'window', 12, 12, 'black', 'true')
    endif
endfor

dev_clear_window ()
stop ()













* 1 读取条形码

* 创建一个条形码处理模型,这里使用默认参数。
create_bar_code_model([], [], BarCodeHandle)
* 设置参数,使得在找到第一个条形码后停止搜索,因为我们期望每张图像中只有一个条形码。
set_bar_code_param(BarCodeHandle, 'stop_after_result_num', 1)
* 减少最小代码长度到1个字符,因为有些2/5工业条形码可能只有一个数字。
* 注意:在实际应用中不推荐这样做,因为它可能会导致更多的误读。
set_bar_code_param_specific(BarCodeHandle, '2/5 Industrial', 'min_code_length', 1)
* 关闭任何已打开的窗口,以确保新窗口可以被正确创建。
dev_close_window()
* 打开一个新的图形窗口,用于显示处理结果。
* 参数分别是:窗口的左上角坐标 (0, 0),宽度 (120),高度 (300),背景颜色 ('black'),以及返回的窗口句柄 (WindowHandle)。
dev_open_window(0, 0, 120, 300, 'black', WindowHandle)
* 设置显示字体大小为14,字体类型为等宽字体 ('mono'),加粗 ('true'),斜体 ('false')。
set_display_font(WindowHandle, 14, 'mono', 'true', 'false')
* 设置绘图模式为边距 ('margin'),这意味着绘制的元素将与窗口边缘保持一定的距离。
dev_set_draw('margin')
* 设置线条宽度为3,这将影响绘制的线条或形状的粗细。
dev_set_line_width(3)
* 开始循环,迭代4次,每次处理一张不同的条形码图像。
for I := 1 to 4 by 1
    * 构造图像文件路径并读取图像,这里的I是一个变量,代表当前迭代的次数。
    * 文件名格式为'barcode/25industrial/25industrial0' + I,例如,第一次迭代时会读取'25industrial01'。
    read_image(Image, 'barcode/25industrial/25industrial0' + I)
    * 获取图像的尺寸,以便正确设置显示窗口的范围。
    get_image_size(Image, Width, Height)
    * 设置窗口的显示区域,使图像完整地填充窗口。
    dev_set_window_extents(0, 0, Width - 1, Height - 1)
    * 在窗口中显示图像。
    dev_display(Image)
    * 设置绘制颜色为绿色。
    dev_set_color('green')
    * 配置为不考虑校验字符进行条形码读取。
    set_bar_code_param(BarCodeHandle, 'check_char', 'absent')
    * 尝试找到并解码条形码,返回解码后的字符串。
    find_bar_code(Image, SymbolRegions, BarCodeHandle, '2/5 Industrial', DecodedDataStrings)
    * 显示解码后的字符串。
    disp_message(WindowHandle, DecodedDataStrings, 'window', 12, 12, 'black', 'false')
    * 计算解码字符串的最后一个字符的位置。
    LastChar := strlen(DecodedDataStrings) - 1
    * 显示最后一个字符,假设这是校验字符,并用森林绿颜色标记。
    disp_message(WindowHandle, sum(gen_tuple_const(LastChar,' ')) + DecodedDataStrings{LastChar}, 'window', 12, 12, 'forest green', 'false')
    * 暂停程序执行,让用户有时间查看结果。
    stop()
    * 现在配置为使用校验字符验证结果。
    set_bar_code_param(BarCodeHandle, 'check_char', 'present')
    * 再次尝试找到并解码条形码,这次包括校验字符的验证。
    * 如果校验字符不正确,条形码读取将会失败。
    find_bar_code(Image, SymbolRegions, BarCodeHandle, '2/5 Industrial', DecodedDataStrings)
    * 显示解码后的字符串(不包括校验字符)。
    disp_message(WindowHandle, DecodedDataStrings, 'window', 36, 12, 'black', 'false')
    * 改变绘制颜色为洋红色。
    dev_set_color('magenta')
    * 如果不是最后一张图片,则暂停,等待用户继续。
    if (I < 4)
        stop()
    endif
endfor
相关推荐
月光水岸New25 分钟前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山67526 分钟前
数据库基础1
数据库
我爱松子鱼29 分钟前
mysql之规则优化器RBO
数据库·mysql
chengooooooo1 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
晴空万里藏片云1 小时前
elment Table多级表头固定列后,合计行错位显示问题解决
前端·javascript·vue.js
曦月合一1 小时前
html中iframe标签 隐藏滚动条
前端·html·iframe
奶球不是球1 小时前
el-button按钮的loading状态设置
前端·javascript
kidding7232 小时前
前端VUE3的面试题
前端·typescript·compositionapi·fragment·teleport·suspense
Rverdoser2 小时前
【SQL】多表查询案例
数据库·sql
Galeoto2 小时前
how to export a table in sqlite, and import into another
数据库·sqlite