Halcon学习笔记(一)——图像阈值化处理

本文介绍了使用Halcon进行图像处理的基础知识,包括如何在VS2013平台上加载图像、进行阈值化处理并显示结果图像。同时,还详细解释了Halcon中不同图像显示函数的功能及HTuple数据类型的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       今天开始,开始学习Halcon图像处理,希望与有共同兴趣的朋友一起学习进步。

                                                                                                                                  -----------pbImage, 2014.04.05

1. vs2013平台阈值化图像

#include "cpp/HalconCpp.h"
#include "Halcon.h"
#include <stdlib.h>

using namespace Halcon;

const char gImageName[256] = "lena.jpg";

int main()
{
	Hobject image, regions;

	HTuple width, height, windowId;

	read_image(&image, gImageName);//载入图像

	get_image_size(image, &width, &height);//获取图像宽、高

	open_window(0, 0, width, height, 0, "", "", &windowId);//创建窗口

	int w = width[0].I();//HTuple类型转换int
	int h = height[0].I();

	//auto_threshold(image, &regions, 2);//基于直方图自适应二值化
	threshold(image, &regions, 64, 128);//固定阈值二值化

	disp_obj(regions, windowId);//显示图像

	getchar();

	return 0;
}


Halcon基础:

1. halcon显示图像的各个函数区别

    disp_image()    图像首通道灰度图,如3通道图像,也仅显示第一个数据通道图像;

    disp_color()      显示彩色图;

    disp_channel() 某特定通道;

    disp_obj()          自动判别类别,即图像为彩色图像,则显示为彩色;如图像为灰色图像,则显示为灰度;

2. write_image(image, "jpg", 0, "image.jpg");  将图像image以jpg格式存储到文件image.jpg中

3. HTuple数据结构与c++数据类型互转

//HTuple与int互转:
HTuple tuple;
int val = 2;
tuple[0] = val;//int 转HTuple
val = tuple[0].I();//HTuple转int
//HTuple与long互转:
long val = 10;
tuple[0] = val;
val = tuple[0].L();
//HTuple与double互转:
double val = 3.3;
tuple[0] = val;
val = tuple[0].D();
//HTuple转const char*:
CString strVal = "Halcon";
tuple[2] = strVal.GetBuffer();
strVal = tuple[2].S();

int num = tuple.Num();

注:初接触Halcon,我的理解是HTuple类似C++中的vector(可能比喻不够恰当), 但是又不同于vector,HTuple可以存不同类型数据,
如HTuple[0]存int型,HTuple[1]存double型,HTuple[2]存字符串...HTuple.Num()返回整个HTuple类型数据的总长度。




*基于Haclcon的车牌提取案例 *1.读取图片 read_image (Image, 'D:/Halcon/7.22素材/车牌.png') *2.彩色》灰度 rgb1_to_gray (Image, GrayImage) *3.阈值分割 threshold (GrayImage, Regions1, 20, 60) *4.连接 connection (Regions1, ConnectedRegions) *5.特征筛选 select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 4864.7, 4872.6) *5.1填充孔洞 fill_up (SelectedRegions, RegionFillUp) *5.2形态学操作:腐蚀、膨胀、开、闭 *开是腐蚀加膨胀 闭是膨胀加腐蚀 *opening_circle (RegionFillUp, RegionOpening, 10) closing_circle (RegionFillUp, RegionClosing, 20) *closing_rectangle1 (RegionFillUp, RegionClosing, 40, 10) *5.3模拟仿射矩形 shape_trans (RegionClosing, RegionTrans, 'rectangle2') *保留框选区域其他的掩盖 reduce_domain (GrayImage, RegionTrans, ImageReduced) *只保留框选区域其他的删掉了 crop_domain (ImageReduced, ImagePart) *6.仿射变换 **放射变换包括:位移、旋、放大缩小 *6.1获取区域的中心点 area_center (RegionTrans, Area, Row, Column) *获取区域与ROw之间的夹角的弧度值 orientation_region (RegionTrans, Phi) ***弧度角度 *6.3创建个仿射变换矩阵 vector_angle_to_rigid (Row, Column, Phi, Row, Column, 3.14, HomMat2D) *6.4锁定要放射的图像 affine_trans_image (ImagePart, ImageAffineTrans, HomMat2D, 'constant', 'false') *6.5对图像进行仿射变换 affine_trans_region (RegionTrans, RegionAffineTrans, HomMat2D, 'nearest_neighbor') *7.将目标区域扣下来 reduce_domain (ImageAffineTrans, RegionAffineTrans, ImageReduced1)我这些代码出不来图片阿
最新发布
07-23
<think>首先,用户的问题是关于调试基于Halcon的车牌识别代码,具体是代码无法显示或输出图片。用户提到了几个步骤:read_image、rgb1_to_gray、threshold等,并希望知道如何调试这些步骤的图像输出。 从系统级指令中,我需要: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 用户提供了三个引用: - 引用[1]:Halcon车牌识别代码示例。 - 引用[2]:另Halcon车牌识别代码。 - 引用[3]:Halcon学习(车牌识别)的代码。 用户的需求是调试代码,使其能显示或输出图片。关键点是:代码无法显示图片,需要调试read_image、rgb1_to_gray、threshold等步骤。 在Halcon中,调试图像输出通常涉及使用dev_display函数来显示图像或区域。用户可能没有正确使用这些函数,或者代码中没有包含显示语句。 回顾用户提供的引用代码: - 在引用[1]中,有dev_display(ImageFilled)和dev_display(Letters)的注释行,但被注释掉了。 - 在引用[2]中,有dev_clear_window()和dev_display的注释行。 - 在引用[3]中,有dev_display(Image)等。 所以,问题可能在于代码中没有激活图像显示功能,或者显示语句被注释掉了。 我的回答应该: 1. **结构清晰**:逐步解释如何调试。 2. **使用中文**。 3. **生成相关问题**:在回答结束后添加相关问题。 4. **引用标识**:如果引用内容,添加引用标识。 步骤: - 首先,解释常见问题:为什么图像不显示? - 然后,提供调试步骤。 - 最后,添加相关问题。 常见原因: 1. 没有调用dev_display函数。 2. 显示窗口没有正确打开。 3. 图像路径错误。 4. 代码执行太快,窗口关闭。 调试步骤: 1. 确保图像读取成功:使用get_image_size或检查图像变量。 2. 打开显示窗口:使用dev_open_window。 3. 显示图像:使用dev_display。 4. 添加暂停:使用disp_continue_message或wait_seconds,以便有时间查看图像。 5. 检查每个步骤的输出:例如,在rgb1_to_gray后显示灰度图像。 在回答中,我需要引用用户提供的引用内容,但用户说“上述引用仅供参考”,所以我应该基于这些引用给出建议。 例如,引用[3]中有dev_open_window和dev_display,所以可以引用它。 最终回答结构: - 引言:解释问题。 - 调试步骤:列出步骤。 - 代码示例:提供修改后的代码片段。 - 结尾:总结。 - 相关问题:添加相关问题。 生成相关问题: - 基于主题,如Halcon调试、图像处理等。 确保LaTeX:用户的问题中没有数学表达式,所以可能不需要,但如果有,要正确格式化。</think>### 调试Halcon车牌识别代码的图像显示问题 在Halcon中调试车牌识别代码时,图像无法显示或输出是常见问题,通常由以下原因导致: - 显示窗口未正确打开或激活。 - 图像读取失败(如路径错误)。 - 关键显示函数(如`dev_display`)缺失或被注释。 - 代码执行过快,窗口未停留足够时间。 - 图像处理步骤(如`read_image`、`rgb1_to_gray`、`threshold`)的输出未正确传递到显示环节。 基于您提供的引用代码(尤其是引用[3]中的完整流程),以下是逐步调试方法。调试核心是**确保每个处理步骤后添加图像显示和暂停功能**,以便可视化中间结果。 --- ### 调试步骤 1. **验证图像读取(`read_image`)**: - 检查图像路径是否正确(绝对路径或相对路径)。 - 添加错误处理:使用`try...catch`捕获读取异常。 - 示例代码: ```halcon try read_image(Image, 'C:/Users/路径/图片.jpg') // 替换为实际路径 catch (Exception) dev_inspect_exception(Exception) // 输出错误信息 endtry ``` - **调试输出**:在`read_image`后添加`dev_display(Image)`和暂停,确认图像是否加载成功。如果图像未显示,可能是路径问题或文件损坏[^3]。 2. **检查灰度换(`rgb1_to_gray`)**: - 确保输入图像是RGB格式(使用`decompose3`验证)。 - 显示灰度图像以验证换: ```halcon rgb1_to_gray(Image, GrayImage) dev_display(GrayImage) // 显示灰度图像 disp_continue_message(WindowHandle, 'black', 'true') // 添加暂停提示 wait_seconds(2) // 暂停2秒,便于观察 ``` - 如果`GrayImage`显示异常(如全黑),检查原始图像是否有效或阈值设置是否合理。 3. **调试阈值处理(`threshold`)**: - 阈值范围需根据图像动态调整。使用`histogram`或`gray_histo`分析灰度分布,辅助设置阈值。 - 显示二值化区域: ```halcon threshold(GrayImage, Regions, MinGray, MaxGray) // MinGray和MaxGray需实验确定 dev_display(Regions) // 显示阈值处理后的区域 disp_continue_message(WindowHandle, 'black', 'true') wait_seconds(2) ``` - 如果`Regions`未显示,可能是阈值范围错误(例如,引用[1]中`threshold (ImageResult3, Regions, 135, 255)`可能不适用于所有图像)[^1]。 4. **确保显示窗口激活**: - 在代码开头显式打开窗口: ```halcon dev_close_window() // 关闭现有窗口 dev_open_window(0, 0, 800, 600, 'black', WindowHandle) // 创建新窗口 set_display_font(WindowHandle, 16, 'mono', 'true', 'false') // 设置字体 ``` - 引用[3]中使用了`dev_open_window`,这是关键步骤[^3]。 5. **添加全局暂停与错误检查**: - 在关键步骤后插入`wait_seconds`或`disp_continue_message`,防止窗口闪退。 - 使用`dev_error_var`检查函数执行状态: ```halcon dev_error_var(Error, 1) // 启用错误捕获 threshold(Image, Regions, 100, 200) if (Error != 0) dev_inspect_error() // 输出错误详情 endif ``` 6. **完整调试示例(基于引用[3]修改)**: ```halcon dev_close_window() dev_open_window(0, 0, 800, 600, 'black', WindowHandle) // 确保窗口打开 read_image(Image, 'C:/路径/图片.jpg') dev_display(Image) // 显示原始图像 disp_continue_message(WindowHandle, '原始图像', 'black', 'true') wait_seconds(3) decompose3(Image, Red, Green, Blue) trans_from_rgb(Red, Green, Blue, Hue, Saturation, Intensity, 'hsv') rgb1_to_gray(Image, GrayImage) dev_display(GrayImage) // 显示灰度图像 disp_continue_message(WindowHandle, '灰度图像', 'black', 'true') wait_seconds(2) threshold(Saturation, Regions, 182, 255) // 阈值根据实际情况调整 dev_display(Regions) // 显示阈值区域 disp_continue_message(WindowHandle, '阈值处理结果', 'black', 'true') wait_seconds(3) // 后续OCR步骤(略,参考引用[1][2]) ``` - **关键修改**:在每个处理步骤后添加`dev_display`和`wait_seconds`,确保所有中间图像可见。 --- ### 常见问题排查 - **图像路径错误**:使用绝对路径并确认文件权限(Halcon默认路径为项目目录)。 - **窗口未更新**:在循环中使用`dev_set_window`指定活动窗口。 - **硬件加速问题**:在图形较差的设备上,尝试`set_system('graphics_stack', 'opengl')`优化显示。 - **输出保存**:如需保存图像,使用`write_image`(如`write_image(GrayImage, 'png', 0, 'gray_output.png')`)。 通过以上步骤,您可以逐步定位问题所在。如果仍无法解决,建议使用Halcon的HDevelop环境单步调试(F10键逐行执行),实时查看变量和图像状态[^1][^3]。 --- ### 相关问题 1. 如何优化Halcon中的阈值分割以提高车牌识别精度? 2. Halcon中如何处理倾斜车牌的旋校正? 3. 在车牌识别中,OCR模型(如`read_ocr_class_mlp`)如何训练和部署? [^1]: 引用[1]:halcon学习笔记——实例篇(1)车牌识别。halcon代码:... [^2]: 引用[2]:halcon车牌的识别。halcon代码:... [^3]: 引用[3]:Halcon学习(车牌识别)。...
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值