基于MATLAB的路面裂缝检测系统[过程图,源码]_基于图像处理的路面裂缝检测-程序员宅基地

技术标签: matlab  图像处理  人工智能  目标跟踪  

基于MATLAB的路面裂缝检测系统[过程图,源码]

  1. 课题背景

裂缝是最常见的路面损坏,可能会危及公路和高速公路的安全。在路面裂缝变的更糟糕之前及时进行修补,可以大大节省路面维修的资金。路面裂缝是评估道路状况,并进行必要的道路维修的重要信息。在过去的二十年,由于基于图像的路面裂缝检测技术提供了一个安全,高效,经济的方式,各种图像处理方法已被提出的路面裂缝检测。

基于假设沿裂缝的强度通常低于背景的强度,周围的路面,强度阈值已被广泛使用于检测裂纹。然而,这些阈值的方法只能产生不相交的裂纹碎片,因为强度沿裂纹可能无法持续低于背景。此外,路面阴影往往导致路面图像的照度不均匀,其还可以降低该阈值设定方法的性能。基于边缘检测的方法也被用于裂纹检测。然而,可能出现的低对比度裂缝和背景之间的散斑裂纹可能会将存在于背景的许多散斑噪声误认为裂纹片段。与传统的人工检测方式相比,视觉检测效率高、自动化程度和安全性更强,本课题拟对基于视觉的路面裂缝检测方法进行研究。传统的基于图像的路面裂缝检测方法通常假设路面裂缝图片具有较高的对比度和较好的连续性,但实际生活中往往不是这样的。这是因为,1)路面影像常常含有路面来自于树木,电线杆以及其他事物的阴影造成的亮度不均匀;2)路面各种纹理带来大量的点状噪声;3)路面裂缝由于汽车载重碾压、风化等作用发生退化造成其对比度下降、连续性降低。以上原因,使得裂缝在路面影像中表现为低信噪比的线状目标,给裂缝的自动化识别带来了很大的困难。为了解决这些问题,我们开发了大地测量学的阴影去除算法去除路面的阴影,而保留的裂缝。然后对去除阴影后的裂缝进行预处理,最后做裂缝提取。

二、 具体实现

2.1 图像灰度化

一般摄像头得到的裂缝图像是24位真彩色图,需转换成灰度图,一方而便于后续的更快速图像处理,另一方而也是对处理多种颜色路面裂缝进行了统一。而且后续的一些处理方法也要求图像是灰度图,所以我们首先对裂缝图像进行灰度化处理。

原图:

图1 原图

灰度后图片:

图2 灰度后

2.2 图像去噪

现实中的数字图像在数字化和传输过程中常受到成像设备与外部环境噪声干扰等影响,称为含噪图像或噪声图像。减少数字图像中噪声的过程称为图像去噪。 实际图像中,多少都会存在一些噪声,而使图像模糊,从而使实验结果不是那么直观,影响我们判断。所以本节我们针对裂缝图像进行去噪。

如下即分别为用均值滤波对加有高斯噪声、椒盐噪声的图像处理后的对比图:

图3 图4

图5 图6

(1) 均值滤波

均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。其基本原理是用均值替代原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y) ,作为处理后图像在该点上的灰度g(x,y)

如下即分别为用均值滤波对加有高斯噪声、椒盐噪声的图像处理后的对比图:

图 7 图 8

代码如下:

     b = imread('123.jpg');

     l=b(:,:,1)*0.299 + b(:,:,2)*0.587 + b(:,:,3)*0.114;

     imshow(b)

     J = imnoise(l,'salt & pepper',0.02);

     k = imnoise(l,'gaussian',0,0.005);

     K1= filter2(fspecial('average',3),J)/255;

     subplot(121),imshow(K1)

     title('3*3的椒盐噪声均值滤波')

     K2= filter2(fspecial('average',7),k)/255;

     subplot(122),imshow(K2)

     title('3*3高斯噪声均值滤波')

(2) 中值滤波

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术。其实现原理如下:将某个像素邻域中的像素按灰度值进行排序,然后选择该序列的中间值作为输出的像素值,让周围像素灰度值的差比较大的像素改取与周围的像素值接近的值,从而可以消除孤立的噪声点。

其具体的操作是:首先确定一个以某个像素为中心点的领域,一般为方形领域(如3 * 3、5 * 5的矩形领域),然后将领域中的各个像素的灰度值进行排序。

如下即分别为用中值滤波对加有高斯噪声、椒盐噪声的图像处理后的对比图:

图 9 图 10

代码如下:

     b = imread('123.jpg');

     l=b(:,:,1)*0.299 + b(:,:,2)*0.587 + b(:,:,3)*0.114;

     imshow(b)

     J = imnoise(l,'salt & pepper',0.02);

     k = imnoise(l,'gaussian',0,0.005);

     K1 = medfilt2(J);

     K2 = medfilt2(k);

     subplot(1,2,1),imshow(K1)

     title('椒盐噪声中值滤波处理')

     subplot(1,2,2),imshow(K2)

     title('高斯噪声中值滤波处理')

(3) 小波变换

小波变换是一种窗口大小固定但其形状可改变的时频局部化分析方法。小波变换利用非均匀的分辨率,即在低频段用高的频率分辨率和低的时间分辨率(宽的分析窗口);而在高频段利用低的频率分辨率和高的时间分辨率(窄的分析窗口),这样就能有效地从信号(如语言、图像等)中提取信息,较好地解决了时间和频率分辨率的矛盾。对于一副图像,我们关心的是它的低频分量,因为低频分量是保持信号特性的重要部分,高频分量则仅仅起到提供信号细节的作用,而且噪声也大多属于高频信息。这样,利用小波变换,噪声信息大多集中在次低频、次高频、以及高频子块中,特别是高频子块,几乎以噪声信息为主,为此,将高频子块置为零,对次低频和次高频子块进行一定的抑制,则可以达到一定的噪声去除效果。

如下即分别为用小波变换对加有高斯噪声、椒盐噪声的图像处理后的对比图:

load sinsin

b = imread('123.jpg');

l=b(:,:,1)*0.299 + b(:,:,2)*0.587 + b(:,:,3)*0.114;

 J = imnoise(l,'salt & pepper',0.02);

k = imnoise(l,'gaussian',0,0.005);

[thr,sorh,keepapp] = ddencmp('den','wv',J);

xd = wdencmp('gbl',J,'sym4',2,thr,sorh,keepapp);

subplot(221)

imshow(J,map)

title('加椒盐噪声')

subplot(222)

imshow(xd,map)

title('椒盐图像小波去噪')

[thr,sorh,keepapp] = ddencmp('den','wv',k);

xd = wdencmp('gbl',k,'sym4',2,thr,sorh,keepapp);

subplot(223)

imshow(k,map)

title('加高斯噪声')

subplot(224)

imshow(xd,map)

title('高斯图像小波去噪')

三 路面阴影消除

路面图像经常被蒙上来自于树木,路灯杆等的阴影。在本节中,我们提出了一个更精确的算法来消除这种阴影探伤。大部分的路面图像是灰色的并没有太多的颜色信息。因此,在本文中,我们重点集中在开发上单色的路面图像的算法。在下面,我们先提出一个纹理平衡的照度补偿模式,以实现均匀的照明,阴影路面图像,然后提交拟议的大地测量学的阴影去除算法。

基于亮度高程模型的阴影区域划分及亮度均衡结果

四、基于灰度图像及其纹理特性的裂缝特征提取

4.1 灰度化

一般的摄像头得到的裂缝图像是24位真彩色图,需要转换成灰度图,一方面便于后续更快速图像处理,另一方面也是对处理多种颜色路面裂缝图片进行了统一。灰度化可以采用标准的平均值法。用f(x,y)表示灰度化后的灰度值,R,G,B分别表示原来真彩色图中的红、绿、蓝分量,有:

f(x, y) = (R, G, B) (1)

f(x, y) = 0. 299R+ 0.587G+ 0.114B (2)

其中0.299 ,0.587和0.114是理论和实验推导证明得出的最合理的灰度图像的权值。下图为处理所得原图和灰度图对照:

4.2 灰度拉伸

大津法在图像分割中得到了广泛的运用,可是我们发现大津法在处理裂缝图像时,当目标物与背景灰度差不太明显时,会出现大块黑色区域,甚至导致丢失整幅图像的信息。由此我们提出了灰度拉伸增强的大津法。其原理就是在大津法的原有基础上通过增加灰度的级数使前后景的灰度差增强。灰度增加的方法是用原有的灰度级同乘以同一个系数,因此扩大灰度的级数,当乘的系数为1时就是大津法的原型。灰度拉伸涉及到了灰度的线性变化,不是完全的线性变换,而是分段进行线性变换,它可以有选择性的拉伸某一段灰度区间以改善输出图像的质量。灰度拉伸的灰度变化函数表达式如下:

(3)

图2是将原图在x1和x2之间的灰度拉伸到y1和y2,如果裂缝图像的灰度集中在较暗的区域而导致图像偏暗,可以用灰度拉伸的方法来拉伸(斜率>1)物体灰度区间来改善图像;同样如果裂缝图像的灰度集中在较亮的区域导致图像偏亮,也可以用灰度拉伸来压缩(斜率<1)物体灰度区间来改善裂缝图像质量。

灰度拉伸变换函数

式3中((x1,y1)和((x2, y2)是图2中两个转折点的坐标。在实现时,对裂缝图像实现不同的灰度拉伸,发现对不同的图像,当遇上不同拉伸系数时,分割效果也相差很多,图3为原图和拉伸图像分割对比。

3 灰度拉伸后图像分割处理

4.3 二值化

通过对裂缝图像的平滑处理抑制了部分噪声,因为路面具有多纹理性、多目标性、裂缝弱信号性、光强的多变性以及裂缝上灰度的多变性,使通常的阈值选取方法很难得到最佳阈值。图像分割是图像处理这门学科中的基本难题,基于阈值的分割则又是图像分割的最基础的难题之一,其难点在于阈值的选取。在本设计中,阈值的选择恰当与否对分割的效果起着决定性的作用,我们通过迭代法和大津法两个经典算法对一系列采集的图片进行分割处理,可以得出大津法选取出来的阈值较为理想,图4为其中之一。

4 图像分割比较

4.4 边缘增强

对于路面裂缝类问题的识别检测来说,边缘检测算法的成功与否在很大程度上影响识别和检测的效果与精度。边缘检测一般的方法是先对图像进行灰度边缘的增强处理,得出增强处理后的图像,然后设定门限,进行门限操作来确定出边缘明显的像素位置。

裂缝的边缘特性无论是裂缝的低灰度值部分还是高灰度值部分,它都与背景都有明显的边缘分界特征。利用边缘特征提取路面裂缝是广泛使用的方法。总结裂缝区别于其他对象的特征。

(1)从外观上看:

裂缝相对路面背景来说颜色更深更暗,因此裂缝上的像素值通常来说是局部最小值;

①裂缝是凹槽,其截面呈马鞍状;

②裂缝通常来说带有线性特征,具有一定的方向性,尤其是单根裂缝。

(2)从频域上分析:

裂缝病害,是一种高幅的负信号,在边缘部分有着高频分量,有阶跃性;

①和路面,属于缓慢变化的低频信号,幅值中等或偏高,具有连续性;

②噪音,由路面颗粒、污渍构成,是一种随机高频信号,其幅值一般较高。

如图5:

5 Canny算子边缘检测处理结果

4.5 特征提取

通过一系列预处理过程,最终日的是要提取裂缝的特征信息,它依靠的是描述物体形状特征的参数,这里包含裂缝的而积、长度和宽度等信息。

4.5.1裂缝“病害”而积计算

,面积在图像处理中的计算实质上就是计算物体(或区域)中包含的像素数,进行区域分割并对图像修正之后,路面图像中,已经把裂缝和破损分割出来,并进行二值化处理。对于病害中裂缝面积的计算,只需统计二值化图像中灰度值为0的像素个数占总像素个数的百分比,即可计算出裂缝面积。

定义二值裂缝图像中裂缝的面积为A就是目标物所占的像素点的个数,既区域边界内包含的总的像素点数。设目标.f(x,y)的大小为M*N,对二值图像,目标物f(x,y)= 1,背景为0,则裂缝的目标面积为:

(4)

以图1横向裂缝为例,图6为去噪后面积像素测试的结果,裂缝病害像素个数占总像素的比例为:

(5)

通过此结果,再根据硬件设备采集设计所定的比例尺,就可得到实际的面积结果,不同比例的数值需根据硬件设计方案确定,本次实验中的图片像素为774 x*1000,所摄取的路面的实际尺寸为697 mm*900 mm,据此即可得出此裂缝实际而积为:

S=摄取路面实际面积尺寸xμ=0.697m*0.9m*0.034=0.0216m² (6)

6 面积计算像素统计结果

在计算面积的过程中还有一个重要的问题就是去噪,这时不能纯粹使用提取骨架来去噪,因为细化后病害面积的特征就会失真,但是孤立的噪声点必须去除,经过边缘空隙填充后,在二值图上仍会有一些噪声点没有去除,这些噪声点为孤立点,会影响后面轮廓跟踪等细节处理,因此我们需要消除这些孤立点噪声。否则会把噪声点计入面积统计的有效像素点中,计算就会出错,为解决这个问题,提出去除孤立点的方法,我们采用长线段与原图进行与操作和判断黑色像素所占比例的方法,就可有效去除孤立点,图7为孤立点去除后的结果。

7 孤立点前后处理对比

4.5.2 裂缝“病害”长度计算

在得到“病害”的面积后,在实际的维护工程中常常还要知道它的大概长度,方便全面了解裂缝损坏程度。路面“病害”形状在大多数情况下非常的复杂,统计它的长度并不是一件容易的事。我们通过对多幅图像处理后的图片研究和分析,得出如果经过某种运算能够把裂缝和破损糅合成一条单像素宽的线,找到它的“骨架”部分,就能够通过统计像素点的个数,根据图片长边或宽边的像素点个数计算出“病害”骨架的长度。下而通过几种方法的综合使用尝试计算裂缝长度。

(1) 提取裂缝“病害”骨架

一个图像的“骨架”是描述图像的几何拓扑性质的重要特征之一。这里主要针对路面裂缝进行细化,尤其突出裂缝特征统计像素点个数,使用一种方法来解决裂缝骨架的提取问题。求解一幅图像骨架的过程通常称作对图像“细化”的过程。

所谓的细化就是从原来的图中去掉一些不需要的点,但仍要保持原来的形状。实际上,就是要保持原图的骨架。裂缝的骨架是具有完整描述裂缝长度以及走向的点所组成的曲线。通过分析可知,在细化一幅图像的过程中必须要满足以下两个条件:

第一,在细化的过程中,图像应该有规律地缩小;

第二,在图像逐步缩小的过程中,应当使图像的连通性值保持不变。

下面是具体的细化算法:

设p为被检测的像素,f(p)为像素p的灰度值,ni(i=1,2,....,8)为p的8领域像素,ni的位置如图8所示。

图8

设集合I={1}表示需要细化的像素子集,集合N={g|g-m≤0}表示背景像素子集,集合R={-m}表示在第m次减薄时,I中被减掉的像素。

图像细化的减薄条件为:

图9是对图7中横纵裂缝阂值分割后的细化结果:

图9 细化结果

(2) 修剪裂缝“病害”骨架

一般情况下,细化的过程会在所生成的图像中留下一些小分支,被称为“毛刺”。毛刺是由边界上单像素尺寸的起伏高低造成的,每一个分支在距分分处不远的地方有一个端点,而且裂缝本身也不光滑,所以存在许多假枝和弯曲。对于单条裂缝而言,一般的短枝对整个病害分析并没有实际意义,而且还会增加后续处理分析的复杂性和出错率,所以只要找到整个裂缝主要的中轴骨架即可。

通过一系列消除端点的3*3邻域运算,使得分支缩短至除去,然后重建留下的分支,这个过程就叫剪枝运算。例如,一个3像素的毛刺在经过3次消除端点的迭代运算后即可消去。由于没有赖以复原的端点留下,毛刺就不会被重建。对于己被细化过的二值图像,剪除长度在L以下的短枝,算法如下:

①首先把二值灰度图像数据转化为0.1值,转化规则是:灰度为0的转化为1,灰度为255的转化为0。

②对于转化后的数据,每一个值为1的点,求其交点数(即分叉),并将所求得的交点数代替其值。

③扫描图像,检测出新端点,并将其置为-1。

④在新端点一定范围内搜索,找出近邻的交点,若其值大于2,则计算端点与交点之间的距离,并判断该距离值是否小于阈值L。是则转往第(5)步,否则继续执行第(4)步,若没有找到交点,则回到第(3)步。

⑤用3x3窗曰从端点跟踪至交点,并消去短枝,交点值减1。

⑥重复(3)到(5)的操作,直到没有新端点。

⑦处理结束,将未消除的端点由-1返回为1。

⑧还原图像数据,对于非0点,值转化为0;对于0值,转化为255。

图10就是对图9的修剪处理结果。

10 修剪结果

(3) 相同特征像素点的合并

由图10可以看出,经过细化与剪枝操作后,计算长度的可操作性就大大提高。对于“病害”形状不复杂时,可直接统计其像素点的个数,进行计算。但对于“病害”形状比较复杂的,仍然不能满足要求,如果直接统计必然会造成误差,而这种误差主要是统计了许多不应该计入长度的像素点。通过对细化和剪枝后的图像分析,进行下而的二次扫描操作,将最后所得的图像作为统计依据,以降低误差的大小。

假设缝间距离最小为L,那么对于细化和剪枝后的图像来说,扫描同一行元素,若两个值为0的像素行坐标之间距离小于L,说明其应为同一个裂缝中的像素,应该只保留一个。如此扫描一遍过后,图像中“病害”的竖向裂缝的长度可计算出。同理,若对每列扫描,然后把所得图像与逐行扫描处理所得图像做“或”叠加运算,若两幅图像中同样位置只要有一个像素值为0,最终输出图像的对应位置就为0。最后统计值为0的像素个数,再乘以比例尺即可得到所求长度。

此处以图10纵向裂缝为例,图11是对处理后的图10纵向裂缝长度计算测试结果,通过比例尺计算可知此裂缝长度L=长度像素个数x 0. 9 =1. 547 m。沥青路而软件检测系统在保证处理速度的同时,还要尽可能地减小误检率。通过本软件不但可以对规则裂缝很好地进行检测,而目_对不规则裂缝进行特征提取,也能够基本满足设计要求,相对人工测量具有更好的可行性和准确性。

图11 长度计算像素点统计结果

最后在计算了而积S和长度L后,可以推导出裂缝的平均宽度W=S/L。宽度的计算在此给出是个估算,因为裂缝宽度具有不规则性和不同一性,不能给出一个定值。

4.6 灰度图像形态学

4.3.1 膨胀和腐蚀

(1) 膨胀:将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。利用它可以填补物体中的空洞。B对X膨胀所产生的二值图像D是满足以下条件的点(x,y)的集合:如果B的原点平移到点(x,y),那么它与X的交集非空。 数学表达式:

膨胀处理:一种消除边界点,使边界点向内部收缩的过程。

(2) 腐蚀:一种消除边界点,使边界向内部收缩的过程。利用它可以消除小而且无意义的物体。B对X腐蚀所产生的二值图像E是满足以下条件的点(x,y)的集合:如果B的原点平移到点(x,y),那么B将完全包含于X中。数学表达式:

腐蚀处理:将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。

4.6.2 膨胀和腐蚀的实现

(1)膨胀的实现

可以使用imdilate函数进行图像膨胀,imdilate函数需要两个基本输入参数,即待处理输入图像和结构元素对象。结构元素对象可以是strel函数返回对象,也可以是一个自己定义表示结构元素邻域二进制矩阵。此外,imdilate还可以接受两个可选参数:PADOPT(padopt) ——影响输出图片大小、PACKOPT(packopt).——说明输入图像是否为打包二值图像(二进制图像)。

步骤1,首先创建一个包含矩形对象二值图像矩阵。

>> BW=zeros(9,10);

>> BW(4:6,4:7) =1

BW =

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

步骤2,使用一个3×3正方形结构元素对象对创建图像进行膨胀。

>> SE=strel('square',3)

SE =
Flat STREL object containing 9 neighbors.

Neighborhood:
1 1 1
1 1 1
1 1 1

步骤3,将图像BW和结构元素SE传递给imdilate函数。

>> BW2=imdilate(BW,SE)

BW2 =

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0

0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

步骤4,显示结果。

>> imshow(BW,'notruesize')

>> imshow(BW2,'notruesize')

(2)腐蚀的实现

可以使用imerode函数进行图像腐蚀。imerode函数需要两个基本输入参数:待处理输入图像以及结构元素对象。此外,imerode函数还可以接受3个可选参数:PADOPT(padopt) ——影响输出图片大小、PACKOPT(packopt).——说明输入图像是否为打包二值图像(二进制图像)。M——指定原始图像行数。

以下程序示例说明了如何对某一副具体图像进行腐蚀操作,腐蚀前后效果对比如图末。

步骤1,读取图像cameraman.tif (该图像是Matlab当前目录下自带图片)

>> BW1=imread('cameraman.tif');

步骤2,创建一个任意形状结构元素对象

>> SE=strel('arbitrary',eye(5));

步骤3,以图像BW1和结构元素SE为参数调用imerode函数进行腐蚀操作。

>> BW2=imerode(BW1,SE);

步骤4,显示操作结果

>> imshow(BW1)
>> figure,imshow(BW2)

4.6.3 开运算和闭运算

  1. 开运算
      先腐蚀后膨胀的过程称为开运算。用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。


(2) 闭运算

先膨胀后腐蚀的过程称为闭运算。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。

通常,由于噪声的影响,图象在阈值化后所得到边界往往是很不平滑的,物体区域具有一些噪声孔,背景区域上散布着一些小的噪声物体。连续的开和闭运算可以有效地改善这种情况。有时需要经过多次腐蚀之后再加上相同次数的膨胀,才可以产生比较好的效果。例如:开运算,B1作用结果:去掉小刺,但未去掉小桥;B2作用结果:有位移。

 闭运算,B1作用结果:去掉小刺,但未去掉小桥;B2作用结果:去掉小刺,和小桥。

腐蚀操作会去掉物体的边缘点,细小物体所有的点都会被认为是边缘点,因此会整个被删去。再做膨胀时,留下来的大物体会变回原来的大小,而被删除的小物体则永远消失了。

膨胀操作会使物体的边界向外扩张,如果物体内部存在小空洞的话,经过膨胀操作这些洞将被补上,因而不再是边界了。再进行腐蚀操作时,外部边界将变回原来的样子,而这些内部空洞则永远消失了。

4.6.3实验代码及结果

(1) 代码:

imerode函数,该函数能够实现二值图像的腐蚀操作;

imdilate函数,该函数能够实现二值图像的膨胀操作;

bw=imread(‘d:\image1’)

bw=rgb2gray(bw)

se1=strel(‘disk’,11);

se2=strel(‘line’,11,90);

bw2= imdilate(bw,se2);

bw1=imerode(bw,se1);

imshow(bw),title(‘原图’)

figure,imshow(bw2), title(‘膨胀后的图像’)

figure,imshow(bw1), title(‘腐蚀后的图像’)

  1. 实验结果

原图:

进行边缘检测后:

进行闭运算后:

腐蚀后:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_75211241/article/details/134872234

智能推荐

class和struct的区别-程序员宅基地

文章浏览阅读101次。4.class可以有⽆参的构造函数,struct不可以,必须是有参的构造函数,⽽且在有参的构造函数必须初始。2.Struct适⽤于作为经常使⽤的⼀些数据组合成的新类型,表示诸如点、矩形等主要⽤来存储数据的轻量。1.Class⽐较适合⼤的和复杂的数据,表现抽象和多级别的对象层次时。2.class允许继承、被继承,struct不允许,只能继承接⼝。3.Struct有性能优势,Class有⾯向对象的扩展优势。3.class可以初始化变量,struct不可以。1.class是引⽤类型,struct是值类型。

android使用json后闪退,应用闪退问题:从json信息的解析开始就会闪退-程序员宅基地

文章浏览阅读586次。想实现的功能是点击顶部按钮之后按关键字进行搜索,已经可以从服务器收到反馈的json信息,但从json信息的解析开始就会闪退,加载listview也不知道行不行public abstract class loadlistview{public ListView plv;public String js;public int listlength;public int listvisit;public..._rton转json为什么会闪退

如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet-程序员宅基地

文章浏览阅读219次。如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet

系统项目报表导出功能开发_积木报表 多线程-程序员宅基地

文章浏览阅读521次。系统项目报表导出 导出任务队列表 + 定时扫描 + 多线程_积木报表 多线程

ajax 如何从服务器上获取数据?_ajax 获取http数据-程序员宅基地

文章浏览阅读1.1k次,点赞9次,收藏9次。使用AJAX技术的好处之一是它能够提供更好的用户体验,因为它允许在不重新加载整个页面的情况下更新网页的某一部分。另外,AJAX还使得开发人员能够创建更复杂、更动态的Web应用程序,因为它们可以在后台与服务器进行通信,而不需要打断用户的浏览体验。在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种常用的技术,用于在不重新加载整个页面的情况下,从服务器获取数据并更新网页的某一部分。使用AJAX,你可以创建异步请求,从而提供更快的响应和更好的用户体验。_ajax 获取http数据

Linux图形终端与字符终端-程序员宅基地

文章浏览阅读2.8k次。登录退出、修改密码、关机重启_字符终端

随便推点

Python与Arduino绘制超声波雷达扫描_超声波扫描建模 python库-程序员宅基地

文章浏览阅读3.8k次,点赞3次,收藏51次。前段时间看到一位发烧友制作的超声波雷达扫描神器,用到了Arduino和Processing,可惜啊,我不会Processing更看不懂人家的程序,咋办呢?嘿嘿,所以我就换了个思路解决,因为我会一点Python啊,那就动手吧!在做这个案例之前先要搞明白一个问题:怎么将Arduino通过超声波检测到的距离反馈到Python端?这个嘛,我首先想到了串行通信接口。没错!就是串口。只要Arduino将数据发送给COM口,然后Python能从COM口读取到这个数据就可以啦!我先写了一个测试程序试了一下,OK!搞定_超声波扫描建模 python库

凯撒加密方法介绍及实例说明-程序员宅基地

文章浏览阅读4.2k次。端—端加密指信息由发送端自动加密,并且由TCP/IP进行数据包封装,然后作为不可阅读和不可识别的数据穿过互联网,当这些信息到达目的地,将被自动重组、解密,而成为可读的数据。不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。2.使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。_凯撒加密

工控协议--cip--协议解析基本记录_cip协议embedded_service_error-程序员宅基地

文章浏览阅读5.7k次。CIP报文解析常用到的几个字段:普通类型服务类型:[0x00], CIP对象:[0x02 Message Router], ioi segments:[XX]PCCC(带cmd和func)服务类型:[0x00], CIP对象:[0x02 Message Router], cmd:[0x101], fnc:[0x101]..._cip协议embedded_service_error

如何在vs2019及以后版本(如vs2022)上添加 添加ActiveX控件中的MFC类_vs添加mfc库-程序员宅基地

文章浏览阅读2.4k次,点赞9次,收藏13次。有时候我们在MFC项目开发过程中,需要用到一些微软已经提供的功能,如VC++使用EXCEL功能,这时候我们就能直接通过VS2019到如EXCEL.EXE方式,生成对应的OLE头文件,然后直接使用功能,那么,我们上篇文章中介绍了vs2017及以前的版本如何来添加。但由于微软某些方面考虑,这种方式已被放弃。从上图中可以看出,这一功能,在从vs2017版本15.9开始,后续版本已经删除了此功能。那么我们如果仍需要此功能,我们如何在新版本中添加呢。_vs添加mfc库

frame_size (1536) was not respected for a non-last frame_frame_size (1024) was not respected for a non-last-程序员宅基地

文章浏览阅读785次。用ac3编码,执行编码函数时报错入如下:[ac3 @ 0x7fed7800f200] frame_size (1536) was not respected for anon-last frame (avcodec_encode_audio2)用ac3编码时每次送入编码器的音频采样数应该是1536个采样,不然就会报上述错误。这个数字并非刻意固定,而是跟ac3内部的编码算法原理相关。全网找不到,国内音视频之路还有很长的路,音视频人一起加油吧~......_frame_size (1024) was not respected for a non-last frame

Android移动应用开发入门_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量-程序员宅基地

文章浏览阅读230次,点赞2次,收藏2次。创建Android应用程序一个项目里面可以有很多模块,而每一个模块就对应了一个应用程序。项目结构介绍_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量

推荐文章

热门文章

相关标签