CUDA:使用C/C++获取输入PGM图像并生成输出PGM图像的示例

152 篇文章 ¥59.90 ¥99.00
本文演示如何使用CUDA和C/C++编写程序,读取输入的PGM图像,通过并行计算处理后生成输出PGM图像。示例代码中,CUDA核函数对每个像素进行灰度值反转,实现图像处理加速。

CUDA:使用C/C++获取输入PGM图像并生成输出PGM图像的示例

在本篇文章中,我将为您展示如何使用CUDA和C/C++编写一个程序,以获取输入的PGM(可移植灰度映射)图像并生成输出的PGM图像。我们将使用CUDA来实现并行计算,以加快图像处理的速度。

PGM是一种简单的灰度图像格式,它以文本形式存储像素值。我们将编写一个程序,该程序将读取输入的PGM图像文件,对其进行处理,然后将处理后的图像保存为输出的PGM图像文件。

首先,我们需要一个示例PGM图像文件作为输入。您可以使用任何PGM图像文件,或者创建一个新的PGM图像文件。确保将输入图像文件命名为"input.pgm",并将其放在您的工作目录中。

接下来,我们需要安装CUDA并设置CUDA开发环境。这超出了本文的范围,因此我们假设您已经完成了这些步骤。

现在,让我们开始编写代码。下面是完整的示例代码:

#include <iostream>
#include 
dev_update_off () // 关闭更新窗口 dev_get_window(WindowHandle) *检查gpu是否存在 query_available_dl_devices (['runtime', 'runtime'], ['gpu', 'cpu'], DLDeviceHandles) if (|DLDeviceHandles| == 0) // 如果不存在gpu throw ('No supported device found to continue this example.') endif DLDevice := DLDeviceHandles[0] // 选择gpu PreprocessParamFileName := 'F:/机器工业视觉/最终训练/2.hdict' // 模型前处理参数文件路径 RetrainedModelFileName := 'F:/机器工业视觉/最终训练/1.hdl' // 模型路径 BatchSizeInference := 1 //每次推理一张图片 MinConfidence := 0.6 // 最小置信度 MaxOverlap := 0.8 //如果两个预测框重叠到某个程度,将其合成一个框 *读取模型设置参数 read_dl_model (RetrainedModelFileName, DLModelHandle) // 读取模型 set_dl_model_param (DLModelHandle, 'batch_size', BatchSizeInference) // 设置每次推理一张图 set_dl_model_param (DLModelHandle, 'device', DLDevice) // 设置设备(gpu) set_dl_model_param (DLModelHandle, 'min_confidence', MinConfidence) // 最小置信度设置 set_dl_model_param (DLModelHandle, 'max_overlap', MaxOverlap) // 重叠框合 read_dict (PreprocessParamFileName, [], [], DLPreprocessParam) // 读取前处理参数 *获取类别信息 get_dl_model_param (DLModelHandle, 'class_names', ClassNames) get_dl_model_param (DLModelHandle, 'class_ids', ClassIDs) *为每个类别定义不同的颜色(可根据需要修改) ClassColors := [] ClassColors[0] := 'red' // 类别inclusion颜色 ClassColors[1] := 'black' // 类别patches颜色 ClassColors[2] := 'blue' // 类别crazing颜色 ClassColors[3] := 'green' // 类别patted颜色 ClassColors[4] := 'yellow' // 类别rolled_in颜色 ClassColors[5] := 'cyan' // 类别scratch颜色 * 如果类别超过5个,可以继续添加或使用颜色生成函数 list_files ('F:/机器工业视觉/最终训练/测试图像', ['files','follow_links','recursive'], ImageFiles) // 遍历图片 tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles) for Ind := 0 to |ImageFiles| - 1 by 1 read_image (Image, ImageFiles[Ind]) get_image_size(Image, Width, Height) gen_dl_samples_from_images (Image, DLSampleBatch) // 把图像转为Batchimage preprocess_dl_samples (DLSampleBatch, DLPreprocessParam) // 前处理代码 apply_dl_model (DLModelHandle, DLSampleBatch, [], DLResultBatch) //开始推理 dev_display(Image) for SampleIndex := 0 to BatchSizeInference - 1 by 1 DLSample := DLSampleBatch[SampleIndex] DLResult := DLResultBatch[SampleIndex] DetectedClassIDs := DLResult.bbox_class_id *获取坐标信息 get_dict_tuple (DLResult, 'bbox_row', BboxRow) // 中心点行坐标 get_dict_tuple (DLResult, 'bbox_col', BboxCol) // 中心点列坐标 get_dict_tuple (DLResult, 'bbox_phi', BboxPhi) // 旋转角度 get_dict_tuple (DLResult, 'bbox_length1', BboxLength1) // 长轴一半长度 get_dict_tuple (DLResult, 'bbox_length2', BboxLength2) // 短轴一半长度 get_dict_tuple (DLResult, 'bbox_confidence', BboxConfidences) *坐标缩放 zoomX := Width / 256.0 zoomY := Height / 256.0 BboxRow := zoomY * BboxRow BboxCol := zoomX * BboxCol BboxLength1 := zoomX * BboxLength1 BboxLength2 := zoomY * BboxLength2 *对每个检测结果进行处理 for i := 0 to |DetectedClassIDs| - 1 by 1 * 获取类别索引名称 classIndex := find(ClassIDs, DetectedClassIDs[i]) className := ClassNames[classIndex] * 获取该类别对应的颜色 if (classIndex < |ClassColors|) boxColor := ClassColors[classIndex] textColor := ClassColors[classIndex] else * 如果类别数超过预定义颜色数,使用默认颜色 boxColor := 'white' textColor := 'white' endif * 生成显示带方向的检测框 gen_rectangle2_contour_xld (BboxRectangle, BboxRow[i], BboxCol[i], BboxPhi[i], BboxLength1[i], BboxLength2[i]) dev_set_color(boxColor) dev_set_line_width(2) dev_display(BboxRectangle) * 计算文本显示位置(在中心点上方) textRow := BboxRow[i] - BboxLength2[i] - 12 textCol := BboxCol[i] * 确保文本位置在图像范围内 if (textRow < 0) textRow := 0 endif * 设置显示字体显示类别名称 set_display_font (WindowHandle, 13, 'mono', 'true', 'false') disp_text (WindowHandle, className, 'image', textRow, textCol, textColor, [], []) endfor stop () endfor endfor 这是一段halcon模型推理源代码,请你将其改为cpp调用halconapi实现,有的没有的算子请用cpp写,要注意算子halconcpp的对应
最新发布
05-31
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值