halcon缺陷检测-印刷品检测(差异化模型),键盘字符缺陷检测

前言

在实际项目中,印刷品缺陷检测是缺陷检测中的难点项目。通常印刷品检测往往具备缺陷小,缺陷所在位置不固定,出现少印或者多印的情况。并且由于产线原因,大量的印刷品在视野中的大小并不是完全一致的,可能出现细微的歪斜,亮度差异等多种不确定的因素。
所以在印刷品检测时,常用的blob分析+差值算法,往往不能满足实际的要求。所以使用差异化模型,对图像区域进行训练,在可靠的精度下,仍然可以达到极快的检测速度。

1:halcon程序

************************************创建训练图像和训练模型***************************
dev_get_window (WindowHandle)
*初始化区域尺寸
ImageSizeWidth1:=[]
ImageSizeHeight1:=[]
*获取20个ROI的区域
Row1:=[394.115, 397.311, 390.92, 512.34, 515.536, 512.34, 630.565, 633.76, 630.565, 748.79, 755.18, 755.18, 173.642, 259.914, 263.109, 173.642, 263.109, 263.109, 493.169, 585.831, 681.689]
Row2:=[465.388, 472.192, 472.192, 590.417, 593.612, 590.417, 708.642, 711.837, 710.033, 830.062, 830.062, 826.867, 219.766, 318.82, 312.429, 222.962, 315.624, 318.82, 545.683, 641.541, 735.399]
Column1:=[341.424, 485.187, 628.95, 344.618, 481.992, 616.171, 335.034, 472.408, 616.171, 341.424, 475.603, 616.171, 200.855, 127.376, 280.724, 756.739, 683.261, 830.218, 827.024, 830.218, 830.218]
Column2:=[424.487, 565.055, 705.624, 434.071, 565.055, 705.624, 424.487, 568.25, 708.818, 421.292, 568.25, 708.818, 296.697, 220.024, 373.371, 842.997, 766.324, 922.866, 920.255, 916.476, 919.671]list_files ('D:/2024Work/work/4.2/键盘160/键盘160', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1read_image (Image, ImageFiles[Index])
*先根据模板匹配,将所要识别的区域矫正在图像中心,便于绘制ROI   
read_shape_model ('D:/模板正面.shm',ShapeModelID)
get_shape_model_contours (ModelContours, ShapeModelID, 1)
find_scaled_shape_model (Image, ShapeModelID, rad(0), rad(90), 0.9, 1.1, 0.1, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Scale, Score)get_image_size (Image, Width, Height)
vector_angle_to_rigid (Row, Column , Angle ,Height/2,Width/2-200,0, HomMat2D)
affine_trans_image (Image, ImageAffineTrans, HomMat2D, 'constant', 'false')*****************绘制区域ROI*************
* for j := 0 to 20 by 1
*     draw_rectangle1 (WindowHandle, Row12, Column12, Row22, Column22)
*     Row1[j]:=Row12
*     Row2[j]:=Row22
*     Column1[j]:=Column12
*     Column2[j]:=Column22
* endfor
**********************************************初始化被测试区域的区域大小  
Row111:=[]
Column111:=[]
Row112:=[]
Colum112:=[]* affRow:=[]
* affColumn:=[]
* affPhi:=[]
for i := 0 to 20 by 1gen_rectangle1 (ROI_0, Row1[i], Column1[i], Row2[i], Column2[i])reduce_domain (ImageAffineTrans, ROI_0, ImageReduced3)crop_domain (ImageReduced3, ImagePart1)binary_threshold (ImagePart1, Region, 'max_separability', 'light', UsedThreshold)area_center (Region, Area, Row3, Column3)smallest_rectangle1 (Region, Row11, Column11, Row21, Column21)*     Row3:=(Row11+Row21)/2
*     Column3:=(Column11+Column21)/2
*     affRow[i]:=[Row3]
*     affColumn[i]:=[Column3]Row111[i]:=[Row11]Column111[i]:=[Column11]Row112[i]:=[Row21]Colum112[i]:=[Column21]*绘制比二值化选中区域更大一些的矩形区域,用于训练模板gen_rectangle1 (Rectangle, Row11-1, Column11-1, Row21+1, Column21+1)reduce_domain (ImagePart1, Rectangle, ImageReduced1)crop_domain (ImageReduced1, ImagePart2)*由于差异化模板需要保持每个输入图像的大小保持一致*所以将第一个训练图像作为基准,提取每个图像的尺寸,便于后续图像进行矫正get_image_size (ImagePart2, Width1, Height1)if (Index!=0)zoom_image_size (ImagePart2, ImagePart2, ImageSizeWidth1[i], ImageSizeHeight1[i], 'constant')elseImageSizeWidth1[i]:=Width1ImageSizeHeight1[i]:=Height1endif*创建文件夹,并将训练图像保存在文件夹中,便于后续提取训练file_exists ('D:/2024Work/work/4.2/键盘160/键盘160/'+i, FileExists)
if (not(FileExists))make_dir('D:/2024Work/work/4.2/键盘160/键盘160/'+i) 
endif
write_image (ImagePart2, 'bmp', 0, 'D:/2024Work/work/4.2/键盘160/键盘160/'+i+'/'+Index)
endfor*创建模型数组,对每个区域进行单独的创建模型varModelID:=[]
for Index1 := 0 to 20 by 1*根据我们所需要的区域尺寸,创建对应的差异化模型create_variation_model (ImageSizeWidth1[Index1], ImageSizeHeight1[Index1], 'byte', 'standard', varModelID1)*读取对应文件夹的所有图像list_files ('D:/2024Work/work/4.2/键盘160/键盘160/'+Index1, ['files','follow_links'], ImageFiles)tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)for Index := 0 to |ImageFiles| - 1 by 1read_image (Image, ImageFiles[Index])*训练模型train_variation_model (Image, varModelID1)*设置模型的最小灰度差值为60,差异化为2prepare_variation_model (varModelID1, 60, 2)*显示模型图案,用于检查get_variation_model (Image, VarImage, varModelID1)dev_display (VarImage)endforvarModelID[Index1]:=varModelID1
endfor
*对创建好的模型数组,逐一写入文件夹中。待使用时提取
for Index2 := 0 to 20 by 1write_variation_model (varModelID[Index2], 'D:/2024Work/work/4.2/键盘160/键盘160/var/'+Index2+'.var')
endforstop ()endfor******************************************对训练模型进行测试******************************
*初始化所有检测区域的尺寸
ImageSizeWidth1:=[30, 40, 35, 33, 33, 45, 52, 38, 56, 37, 28, 28, 53, 43, 44, 29, 41, 50, 22, 41, 34]
ImageSizeHeight1:=[62, 62, 62, 61, 61, 62, 61, 61, 62, 56, 60, 36, 24, 42, 35, 29, 32, 34, 32, 46, 42]
*初始化检测区域ROI的位置参数
Row1:=[394.115, 397.311, 390.92, 512.34, 515.536, 512.34, 630.565, 633.76, 630.565, 748.79, 755.18, 755.18, 173.642, 259.914, 263.109, 173.642, 263.109, 263.109, 493.169, 585.831, 681.689]
Row2:=[465.388, 472.192, 472.192, 590.417, 593.612, 590.417, 708.642, 711.837, 710.033, 830.062, 830.062, 826.867, 219.766, 318.82, 312.429, 222.962, 315.624, 318.82, 545.683, 641.541, 735.399]
Column1:=[341.424, 485.187, 628.95, 344.618, 481.992, 616.171, 335.034, 472.408, 616.171, 341.424, 475.603, 616.171, 200.855, 127.376, 280.724, 756.739, 683.261, 830.218, 827.024, 830.218, 830.218]
Column2:=[424.487, 565.055, 705.624, 434.071, 565.055, 705.624, 424.487, 568.25, 708.818, 421.292, 568.25, 708.818, 296.697, 220.024, 373.371, 842.997, 766.324, 922.866, 920.255, 916.476, 919.671]
*初始化差异化模型数组,用于存放读取的全部模型
varmodel:=[]
*将全部模型进行读取并存放在数组中
for Index1 := 0 to 20 by 1read_variation_model ('D:/2024Work/work/4.2/键盘160/键盘160/var/'+Index1+'.var', ModelID)varmodel[Index1]:=ModelID
endfor
*读取产品模板匹配的模板
read_shape_model ('D:/模板正面.shm',ShapeModelID)list_files ('D:/2024Work/work/4.2/键盘160/键盘160', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1read_image (Image, ImageFiles[Index])
*********************rgb1_to_gray (Image, Image2)
*进行模板匹配。寻找图中的形状,并将所要检测的区域矫正到图像中心
find_scaled_shape_model (Image2, ShapeModelID, rad(0), rad(90), 0.9, 1.1, 0.1, 1, 0.5, 'least_squares', 0, 0.9, Row9, Column9, Angle9, Scale, Score)
get_image_size (Image, Width, Height)
vector_angle_to_rigid (Row9, Column9 , Angle9 ,Height/2,Width/2-200,0, HomMat2D1)
affine_trans_image (Image2, ImageAffineTrans, HomMat2D1, 'constant', 'false')for i := 0 to 20 by 1*根据ROI的参数,获取到图像区域,并对图像区域进行裁切gen_rectangle1 (ROI_0, Row1[i], Column1[i], Row2[i], Column2[i])reduce_domain (ImageAffineTrans, ROI_0, ImageReduced4)crop_domain (ImageReduced4, ImagePart)binary_threshold (ImagePart, Region1, 'max_separability', 'light', UsedThreshold1)smallest_rectangle1 (Region1, Row12, Column12, Row22, Column22)*根据图像区域对图像进行二次裁切,使得图像满足差异化模型gen_rectangle1 (Rectangle1, Row12-1, Column12-1, Row22+1, Column22+1)reduce_domain (ImagePart, Rectangle1, ImageReduced2)crop_domain (ImageReduced2, ImagePart3)*根据差异化模型的区域大小,对裁切的区域进行缩放,将区域的大小与差异化模型进行相匹配zoom_image_size (ImagePart3, ImageZoom, ImageSizeWidth1[i], ImageSizeHeight1[i], 'constant')*将区域应用在差异化模型中compare_variation_model (ImageZoom, RegionDiff, varmodel[i])*将差异部分的区域分割开来connection (RegionDiff, ConnectedRegions)*将区域面积大于30的作为缺陷进行输出select_shape (ConnectedRegions, SelectedRegions1, 'area', 'and', 30, 10000000)dev_display (ImagePart3)dev_display (SelectedRegions1)stop ()
endfor
endfor

2:halcon程序解析

2.1创建训练模型和训练图像

2.1.1图像矫正

可以预先创建好模板后,直接读取模板文件,然后进行图像仿射变换将图像区域矫正到图像的中央,便于后续绘制ROI。
其中需要注意,矫正后的图像应该保持每个字符识别的区域都要可见。

read_shape_model ('D:/模板正面.shm',ShapeModelID)
get_shape_model_contours (ModelContours, ShapeModelID, 1)
find_scaled_shape_model (Image, ShapeModelID, rad(0), rad(90), 0.9, 1.1, 0.1, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Scale, Score)get_image_size (Image, Width, Height)
vector_angle_to_rigid (Row, Column , Angle ,Height/2,Width/2-200,0, HomMat2D)
affine_trans_image (Image, ImageAffineTrans, HomMat2D, 'constant', 'false')

矫正前
在这里插入图片描述
矫正后
在这里插入图片描述

2.1.2绘制ROI

对图像上的每个需要识别的单独区域进行ROI的绘制

*****************绘制区域ROI*************for j := 0 to 20 by 1draw_rectangle1 (WindowHandle, Row12, Column12, Row22, Column22)Row1[j]:=Row12Row2[j]:=Row22Column1[j]:=Column12Column2[j]:=Column22endfor
*********************************************

在绘制ROI时,应该将ROI尽可能的覆盖到全部识别的区域,比识别的区域稍大,但又不会覆盖到其他区域的大小,并且尽可能的大一些可以有效的防止矫正精度不够时,仍然可以准确的识别的所需要识别的区域。
在这里插入图片描述
将绘制完成后的区域坐标复制并粘贴到程序中,后续就不需要重复的绘制ROI
在这里插入图片描述

2.1.3生成被检测的区域

通过对绘制好的ROI进行裁剪,使用自动二值化阈值,提取到模型的区域,然后再根据实际物体的大小绘制比实际物体稍大一点的图像作为训练图像进行输出

    gen_rectangle1 (ROI_0, Row1[i], Column1[i], Row2[i], Column2[i])reduce_domain (ImageAffineTrans, ROI_0, ImageReduced3)crop_domain (ImageReduced3, ImagePart1)binary_threshold (ImagePart1, Region, 'max_separability', 'light', UsedThreshold)area_center (Region, Area, Row3, Column3)smallest_rectangle1 (Region, Row11, Column11, Row21, Column21)*绘制比二值化选中区域更大一些的矩形区域,用于训练模板gen_rectangle1 (Rectangle, Row11-1, Column11-1, Row21+1, Column21+1)reduce_domain (ImagePart1, Rectangle, ImageReduced1)crop_domain (ImageReduced1, ImagePart2)

在这里插入图片描述

2.1.4保存图像

对首张图像,我们需要获取到第一张图像的全部被识别的区域的大小,并对后续的所有图像区域进行对应的缩放。差异化模型需要保证所有测试图像和训练图像都保持同一个大小。

*由于差异化模板需要保持每个输入图像的大小保持一致*所以将第一个训练图像作为基准,提取每个图像的尺寸,便于后续图像进行矫正get_image_size (ImagePart2, Width1, Height1)if (Index!=0)zoom_image_size (ImagePart2, ImagePart2, ImageSizeWidth1[i], ImageSizeHeight1[i], 'constant')elseImageSizeWidth1[i]:=Width1ImageSizeHeight1[i]:=Height1endif*创建文件夹,并将训练图像保存在文件夹中,便于后续提取训练file_exists ('D:/2024Work/work/4.2/键盘160/键盘160/'+i, FileExists)
if (not(FileExists))make_dir('D:/2024Work/work/4.2/键盘160/键盘160/'+i) 
endif
write_image (ImagePart2, 'bmp', 0, 'D:/2024Work/work/4.2/键盘160/键盘160/'+i+'/'+Index)

在这里插入图片描述
同样,将所有获取到的尺寸保存的数组中。

2.1.5训练和保存模型


*创建模型数组,对每个区域进行单独的创建模型varModelID:=[]
for Index1 := 0 to 20 by 1*根据我们所需要的区域尺寸,创建对应的差异化模型create_variation_model (ImageSizeWidth1[Index1], ImageSizeHeight1[Index1], 'byte', 'standard', varModelID1)*读取对应文件夹的所有图像list_files ('D:/2024Work/work/4.2/键盘160/键盘160/'+Index1, ['files','follow_links'], ImageFiles)tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)for Index := 0 to |ImageFiles| - 1 by 1read_image (Image, ImageFiles[Index])*训练模型train_variation_model (Image, varModelID1)*设置模型的最小灰度差值为60,差异化为2prepare_variation_model (varModelID1, 60, 2)*显示模型图案,用于检查get_variation_model (Image, VarImage, varModelID1)dev_display (VarImage)endforvarModelID[Index1]:=varModelID1
endfor
*对创建好的模型数组,逐一写入文件夹中。待使用时提取
for Index2 := 0 to 20 by 1write_variation_model (varModelID[Index2], 'D:/2024Work/work/4.2/键盘160/键盘160/var/'+Index2+'.var')
endfor    

2.2测试模型

2.2.1初始化参数和模型

检测区域的尺寸,ROI位置参数,差异化模型,模板均可以在前面进行复制粘贴即可

******************************************对训练模型进行测试******************************
*初始化所有检测区域的尺寸
ImageSizeWidth1:=[30, 40, 35, 33, 33, 45, 52, 38, 56, 37, 28, 28, 53, 43, 44, 29, 41, 50, 22, 41, 34]
ImageSizeHeight1:=[62, 62, 62, 61, 61, 62, 61, 61, 62, 56, 60, 36, 24, 42, 35, 29, 32, 34, 32, 46, 42]
*初始化检测区域ROI的位置参数
Row1:=[394.115, 397.311, 390.92, 512.34, 515.536, 512.34, 630.565, 633.76, 630.565, 748.79, 755.18, 755.18, 173.642, 259.914, 263.109, 173.642, 263.109, 263.109, 493.169, 585.831, 681.689]
Row2:=[465.388, 472.192, 472.192, 590.417, 593.612, 590.417, 708.642, 711.837, 710.033, 830.062, 830.062, 826.867, 219.766, 318.82, 312.429, 222.962, 315.624, 318.82, 545.683, 641.541, 735.399]
Column1:=[341.424, 485.187, 628.95, 344.618, 481.992, 616.171, 335.034, 472.408, 616.171, 341.424, 475.603, 616.171, 200.855, 127.376, 280.724, 756.739, 683.261, 830.218, 827.024, 830.218, 830.218]
Column2:=[424.487, 565.055, 705.624, 434.071, 565.055, 705.624, 424.487, 568.25, 708.818, 421.292, 568.25, 708.818, 296.697, 220.024, 373.371, 842.997, 766.324, 922.866, 920.255, 916.476, 919.671]
*初始化差异化模型数组,用于存放读取的全部模型
varmodel:=[]
*将全部模型进行读取并存放在数组中
for Index1 := 0 to 20 by 1read_variation_model ('D:/2024Work/work/4.2/键盘160/键盘160/var/'+Index1+'.var', ModelID)varmodel[Index1]:=ModelID
endfor
*读取产品模板匹配的模板
read_shape_model ('D:/模板正面.shm',ShapeModelID)

2.2.2测试模型并检测

rgb1_to_gray (Image, Image2)
*进行模板匹配。寻找图中的形状,并将所要检测的区域矫正到图像中心
find_scaled_shape_model (Image2, ShapeModelID, rad(0), rad(90), 0.9, 1.1, 0.1, 1, 0.5, 'least_squares', 0, 0.9, Row9, Column9, Angle9, Scale, Score)
get_image_size (Image, Width, Height)
vector_angle_to_rigid (Row9, Column9 , Angle9 ,Height/2,Width/2-200,0, HomMat2D1)
affine_trans_image (Image2, ImageAffineTrans, HomMat2D1, 'constant', 'false')for i := 0 to 20 by 1*根据ROI的参数,获取到图像区域,并对图像区域进行裁切gen_rectangle1 (ROI_0, Row1[i], Column1[i], Row2[i], Column2[i])reduce_domain (ImageAffineTrans, ROI_0, ImageReduced4)crop_domain (ImageReduced4, ImagePart)binary_threshold (ImagePart, Region1, 'max_separability', 'light', UsedThreshold1)smallest_rectangle1 (Region1, Row12, Column12, Row22, Column22)*根据图像区域对图像进行二次裁切,使得图像满足差异化模型gen_rectangle1 (Rectangle1, Row12-1, Column12-1, Row22+1, Column22+1)reduce_domain (ImagePart, Rectangle1, ImageReduced2)crop_domain (ImageReduced2, ImagePart3)*根据差异化模型的区域大小,对裁切的区域进行缩放,将区域的大小与差异化模型进行相匹配zoom_image_size (ImagePart3, ImageZoom, ImageSizeWidth1[i], ImageSizeHeight1[i], 'constant')*将区域应用在差异化模型中compare_variation_model (ImageZoom, RegionDiff, varmodel[i])*将差异部分的区域分割开来connection (RegionDiff, ConnectedRegions)*将区域面积大于30的作为缺陷进行输出select_shape (ConnectedRegions, SelectedRegions1, 'area', 'and', 30, 10000000)dev_display (ImagePart3)dev_display (SelectedRegions1)stop ()
endfor

实际检测效果
在这里插入图片描述

3.总结

上面其中重点提到了对ROI的选取。核心的关键在于如何去矫正图像,矫正区域。这个图像,由于已经预先固定在一个指定的区域,所以在检测时可以通过ROI去框选检测。而且每个检测区域有着较大的距离,所以在框选ROI时误差相对会比较的少。
对于上图而言20个检测区域,实际总共检测耗时在70ms左右。检测速度可以达到相当快,并且检测精度高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java-数组转换为List集合

方法一:使用 Arrays.asList() 方法 Arrays.asList() 方法可以将数组转换为一个固定大小的List。 import java.util.Arrays; import java.util.List; import java.util.ArrayList; public class ArrayToListExample { public static void main(String[] args…

易绘创云打印怎么样?易绘创云打印好用吗?

随着云技术的发展,云打印等概念也逐渐火热了起来。作为当下云打印服务行业中的佼佼者,易绘创云打印服务页一直被众多用户讨论着。那么易绘创云打印怎么样?易绘创云打印好用吗?今天小易就带大家来介绍一下。 易绘创云打印怎么样&am…

C语言面试题之合法二叉搜索树

合法二叉搜索树 实例要求 实现一个函数,检查一棵二叉树是否为二叉搜索树; 示例 1: 输入:2/ \1 3 输出: true 示例 2: 输入:5/ \1 4/ \3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 …

Vuex(vue 项目中实现 频繁、大范围数据共享的技术方案)

参考文档(点击查看) 好处 1.数据的存取一步到位,不需层层传递 2.数据的流动非常清晰 3.存储在Vuex中的数据都是响应式的(数据更新后,使用数据的组件都会自动更新) Vuex基础配置 npm i vuex3.6.2state中用来存储数据&#xff0c…

三:synchronized 关键字

目录 1、共享带来的问题2、synchronized 用法3、类加载器对 Class 锁的影响4、synchronized 实现原理4.1、同步方法、同步代码块4.2、对象内存布局4.3、Monitor 对象定义 5、synchronized 与原子性6、synchronized 与可见性7、synchronized 与有序性8、synchronized 锁升级8.1、…

外包干了15天,技术倒退明显

先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近6年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能…

第十四届蓝桥杯大赛软件赛省赛C/C++大学 B 组

第十四届蓝桥杯大赛软件赛省赛C/C大学 B 组 文章目录 第十四届蓝桥杯大赛软件赛省赛C/C大学 B 组1、日期统计2、01串的熵3、冶炼金属4、飞机降落5、接龙数列6、岛屿个数7、子串简写8、整数删除9、景区导游10、砍树 1、日期统计 分析: 本题的意思就是2023年一整年&a…

c++作业day4

头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> #include <QTime> #include <QTextToSpeech> #include <QMessageBox> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass…

技术分享 | Frida 实现 Hook 功能的强大能力

Frida 通过 C 语言将 QuickJS 注入到目标进程中&#xff0c;获取完整的内存操作权限&#xff0c;达到在程序运行时实时地插入额外代码和数据的目的。官方将调用代码封装为 python 库&#xff0c;当然你也可以直接通过其他的语言调用 Frida 中的 C 语言代码进行操作。 Frida安装…

【现代C++】线程支持库

现代C&#xff08;C11及其之后的版本&#xff09;引入了标准的线程支持库&#xff0c;使得多线程编程变得更加简单和可移植。这个库提供了线程管理、互斥量、条件变量和其他同步原语。 1. std::thread - 基本线程 std::thread允许创建执行特定任务的线程。 #include <ios…

【刷题】备战蓝桥杯 — dfs 算法

送给大家一句话&#xff1a; 风度真美&#xff01; 即使流泪&#xff0c;也要鼓掌&#xff0c; 即使失望&#xff0c;也要满怀希望。 ——刘宝增 dfs 算法 1 前言2 洛谷 P1030 [NOIP2001 普及组] 求先序排列题目描述算法思路 3 洛谷 P1294 高手去散步题目描述算法思路 4 蓝桥…

【数据结构】树与二叉树遍历算法的应用(求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子)

目录 求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子应用一&#xff1a;统计二叉树中叶子结点个数的算法写法一&#xff1a;使用静态变量写法二&#xff1a;传入 count 作为参数写法三&#xff1a;不使用额外变量 应用二&am…

Redis部署之主从

使用两台云服务器&#xff0c;在 Docker 下部署。 Redis版本为&#xff1a;7.2.4 下载并配置redis 配置文件 下载 wget -c http://download.redis.io/redis-stable/redis.conf配置 master节点配置 bind 0.0.0.0 # 使得Redis服务器可以跨网络访问,生产环境请考虑…

Linux 开发----在线英语字典

应用开发&#xff01; 这款应用程序是在Linux操作系统下完成的&#xff0c;整个项目包含了众多的知识点&#xff08;文件IO、进程、网络、数据库&#xff09;。动手操作之前可以先大致设计出流程图&#xff0c;然后根据流程图进行各个模块的实现&#xff08;注册模块、登录模块…

谈谈什么是 Redis

&#x1f525;博客主页&#xff1a;fly in the sky - CSDN博客 &#x1f680;欢迎各位&#xff1a;点赞&#x1f44d;收藏⭐️留言✍️&#x1f680; &#x1f386;慢品人间烟火色,闲观万事岁月长&#x1f386; &#x1f4d6;希望我写的博客对你有所帮助,如有不足,请指正&#…

RISC-V GNU Toolchain 工具链安装问题解决(stdio.h 问题解决,pk fence.i 问题解决)

我的安装过程主要参照 riscv-collab/riscv-gnu-toolchain 的官方 Readme 和这位佬的博客&#xff1a;RSIC-V工具链介绍及其安装教程 - 风正豪 &#xff08;大佬的博客写的非常详细&#xff0c;唯一不足就是 sudo make linux -jxx 是全部小写。&#xff09; 工具链前前后后我装了…

【数据结构】-- 单链表 vs 双向链表

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

动态规划刷题(2)之杨辉三角(详细解释)

最近在自学动态规划,网上到处找资料学习: 在这里记录我的刷题历史: 题目都是在力扣里面刷的!! 这里,我放一个刷动态规划的链接在这里:动态规划知识点题库 - 力扣(LeetCode) 力扣 在这里附加动态规划相关知识点:动态规划(DP)-CSDN博客文章浏览阅读197次。动态规划…

算法第四十一天-排除排序链表中的重复元素Ⅱ

排除排序链表中的重复元素Ⅱ 题目要求 解题思路 题意&#xff1a;在一个有序链表中&#xff0c;如果一个节点的值出现不止一次&#xff0c;那么把这个节点删除掉 重点&#xff1a;有序链表&#xff0c;所以&#xff0c;一个节点的值出现不止一次&#xff0c;那么他们必相邻。…

爬虫 新闻网站 以湖南法治报为例(含详细注释,控制台版) V2.0 升级自定义查询关键词、时间段

目标网站&#xff1a;湖南法治报 爬取目的&#xff1a;为了获取某一地区更全面的在湖南法治报已发布的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 环境&#xff1a;Pycharm2021&#xff0c;Python3.10&#xff0c; 安装的包&#xff1a;requests&#xff0c;csv&#xff…