【OpenCV-Python】——哈里斯/Shi-Tomas角检测FAST/SIFT/ORB特征点检测暴力/FLANN匹配器对象查找

news2024/10/7 0:54:57

目录

前言:

1、角检测

1.1 哈里斯角检测

 1.2 优化哈里斯角

 1.3 Shi-Tomasi角检测

2、特征点检测

2.1 FAST特征点检测

2.2 SIFT特征检测

2.3 ORB特征检测

3、特征匹配

3.1 暴力匹配器

3.2 FLANN匹配器

4、对象查找

总结:


前言:

图像的特征是指图像中具有独特性和易识别性的区域,如角和边缘等。提取特征并对其进行描述,便于图像匹配和搜索。

1、角检测

1.1 哈里斯角检测

cv2.conerHarris()函数根据哈里斯角检测器算法检测图像中的角:

dst=cv2.conerHarris(src,blocksize,ksize,k)

src:8位单通道或浮点值图像

blocksize:邻域大小,越大检测出的角占的区域越大

ksize:使用Sobel算子的中孔参数

k:自由参数。Ksize和k影响检测的敏感度,越小检测出的角越多,但准确率降低

dst:返回的numpy.ndarray对象,大小与src相同,每个数组元素对应一个像素点,值越大对应像素点是角的概率越高。即保存了角的坐标信息。

import cv2
import numpy as np
img=cv2.imread('lifangti.png')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  #转换为灰度图
gray=np.float32(gray)    #转换为浮点类型
dst=cv2.cornerHarris(gray,8,7,0.01)  #执行角检测
#将检测结果中值大于“最大值0.02”对应的像素设置为红色
img[dst>0.02*dst.max()]=[0,0,255]
cv2.imshow('dst',img)   #显示检测结果
cv2.waitKey(0)
cv2.destroyAllWindows()

 1.2 优化哈里斯角

上面检测出的哈里斯角包含了一定数量的像素,有些情况下需要进一步处理找出角的更精确位置,利用cv2.cornerSubPix()函数实现:

dst=cv2.cornerSubPix(src,corners,winsize,zeroZone,criteria)
src:8位单通道或浮点值图像
Corners:哈里斯角的质心坐标
Winsize:搜索窗口边长的一半
zeroZone:零值边长的一半
Criteria:优化查找的终止条件
Dst:返回的numpy.ndarray对象,存储优化后的角信息
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('lifangti.png')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  #转换为灰度图
gray=np.float32(gray)    #转换为浮点类型
dst=cv2.cornerHarris(gray,8,7,0.01)  #执行角检测
r,dist=cv2.threshold(dst,0.01*dst.max(),255,0)  #二值化阈值处理
dst=np.uint8(dst)  #转换为整型
r,l,s,cxys=cv2.connectedComponentsWithStats(dst)  #查找质点坐标
cif=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,100,0.01)  #定义优化查找条件
corners=cv2.cornerSubPix(gray,np.float32(cxys),(5,5),(-1,-1),cif)  #执行优化查找
res=np.hstack((cxys,corners))   #堆叠构造新数组,便于标注角
res=np.int0(res)  #转换为整型
img[res[:,1],res[:,0]]=[0,0,255]  #将哈里斯角对应像素设置为红色
img[res[:,3],res[:,2]]=[255,0,0]  #将优化结果像素设置为蓝色
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)   #转换为RGB格式
plt.imshow(img)
plt.axis('off')
plt.show()

 1.3 Shi-Tomasi角检测

 Shi-Tomasi角检测改进的角检测方法,cv2.goodFeaturesToTrack()函数使用Shi-Tomasi角检测器查找图像中N个最强角:

dst=cv2.goodFeaturesToTrack(src,maxCorner,qualityLevel,minDistance)
dst是返回的结果,保存了检测到的角在原图像中的坐标
src是8位单通道或浮点值图像
maxCorner:返回的角的最大数量
qualityLevel:可接受角的最低质量
minDistance:返回的角之间的最小欧几里得距离
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('six.png')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  #转换为灰度图
gray=np.float32(gray)    #转换为浮点类型
corners=cv2.goodFeaturesToTrack(gray,7,0.1,100) #检测角,最多7个
corners=np.int0(corners)  #转换为整型
for i in corners:
    x,y=i.ravel()
    cv2.circle(img,(x,y),4,(255,0,0),-1) #用蓝色圆点标出找到的点
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)   #转换为RGB格式
plt.imshow(img)
plt.axis('off')
plt.show()


2、特征点检测

特征点即图像中具有唯一性的像素,也称兴趣点或关键点,角是特殊的特征点。

2.1 FAST特征点检测

该检测器主要根据像素周围16个像素的强度和阈值等参数来判断像素是否为关键点。

首先用cv2.FastFeatureDetector_create()函数创建一个FAST对象,然后调用FAST对象的detect()方法执行关键点检测。结果返回一个关键点阵表,每个关键点对象均包含了关键点的角度、坐标、响应强度和领域大小等信息。响应强度越大约有可能属于角:

import cv2
img=cv2.imread('lifangti.png')   #打开图像,默认时BGR格式
fast=cv2.FastFeatureDetector_create() #创建FAST检测器
kp=fast.detect(img,None)#检测关键点,不使用掩模
img2=cv2.drawKeypoints(img,kp,None,color=(0,0,255))#绘制关键点
cv2.imshow('FAST points',img2)#显示绘制了关键点的图像
fast.setThreshold(20)#设置阈值,默认阈值10
kp=fast.detect(img, None)#检测关键点,不使用掩模
n=0
for p in kp:#输出关键点信息
    print("第%s个关键点,坐标:"%(n+1),p.pt,'响应强度:',p.response,'领域大小:',p.size,'角度:',p.angle)
    n+=1
img3=cv2.drawKeypoints(img,kp,None,color=(0,0,255))
cv2.imshow('Treshold20',img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

2.2 SIFT特征检测

图像中的角具有旋转不变的特性,但在放大或缩小图象时角可能发生变化。SIFT是指尺度不变特征变换,用于查找图像尺度不变的特征,返回图像中的关键点。

首先用cv2.SIFT_create()函数创建一个SIFT对象,然后调用SIFT对象的detect()方法执行关键点检测:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('six.png')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  #转换为灰度图
sift=cv2.SIFT_create() #创建SIFT检测器,已申请专利要购买才可运行
kp=sift.detect(gray,None)   #检测关键点
img2=cv2.drawKeypoints(img,kp,None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) #绘制关键点
img2=cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)   #转换为RGB格式
plt.imshow(img2)
plt.axis('off')
plt.show()

2.3 ORB特征检测

以FAST特征检测器和BRIEF描述符为基础进行了改进,检测性能更好。过程同理。


3、特征匹配

通过上面的特征检测得到关键点的描述符,可用于图像的特征匹配。在计算图1中是否包含图2时,图1为训练图像,图2为查询图像,图1的关键点描述符为训练描述符,图2的关键点描述符为查询描述符。

3.1 暴力匹配器

使用描述符进行特征比较。首先在查询描述符中取一个关键点的描述符,与训练描述符中的所有关键点描述符进行比较,每次比较后会给出一个距离值,距离最小的值对应最佳匹配结果,结果返回匹配结果列表。

使用过程也是先使用cv2.BFMatcher_create()函数创建匹配器,然后调用对象的match方法返回每个关键点的最佳匹配结果。(knnMatch方法可返回指定数量的最佳匹配结果)

①cv2.BFMatcher_create()函数

bf=cv2.BFMatcher_create(normType,crossCheck)
bf:返回的暴力匹配器对象。两个参数都是可选的:
normType:距离测量类型,默认是cv2.NORM_L2。通常SIFT、SURF等描述符使用cv2.NORM_L1或cv2.NORM_L2;ORB、BRISK或BRIEF等描述符使用cv2.NORM_HAMMING。
crossCheck:默认False,匹配器为每个查询描述符找到k个距离最近的匹配描述符。为True时,只返回满足交叉验证条件的匹配结果。

②match()方法

ms=bf.match(des1,des2)
ms是返回的匹配结果,是一个DMatch对象列表。每个DMatch对象表示关键点的一个匹配结果,其distance属性表示距离,值越小匹配度越高。
des1是查询描述符
des2是训练描述符

获得结果后可用cv2.drawMatches()或cv2.drawMatchesKnn()函数绘制匹配结果图像:

outImg=cv2.drawMatches(img1,keypoints1,img2,keypoints2,matches1to2,outImg,matchcolor,singlePointsColor,matchesMask,flags)
outImg=cv2.drawMatchesKnn(img1,keypoints1,img2,keypoints2,matches1to2,outImg,matchcolor,singlePointsColor,matchesMask,flags)
outImg是返回的绘制结果图像,图像中查询图像与训练图像中匹配的关键点和两点之间连线为彩色。
img1是查询图像;img2是训练图像。
keypoints是关键点。
matches 1to2是img1和img2的匹配结果。
后四个是可选参数,matchColor是关键点和连接线的颜色,默认随机;singlePointColor是单个关键点的颜色,默认随机;matchesMask是掩模,用于决定绘制哪些匹配结果,默认为空,表示绘制所有匹配结果;flags是标志,如cv2.DrawMatchFlags_DEFAULT等。

示例代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('cat.png',cv2.IMREAD_GRAYSCALE)
img2=cv2.imread('catface.png',cv2.IMREAD_GRAYSCALE)
orb=cv2.ORB_create()   #创建ORB检测器
kp1,des1=orb.detectAndCompute(img1,None)  #检测关键点和计算描述符
kp2,des2=orb.detectAndCompute(img2,None)  #检测关键点和计算描述符
bf=cv2.BFMatcher_create(cv2.NORM_HAMMING,crossCheck=True)  #创建匹配器,True
ms=bf.match(des1,des2)    #执行特征匹配
ms=sorted(ms,key=lambda x:x.distance)  #按距离排序
img3=cv2.drawMatches(img1,kp1,img2,kp2,ms[:20],None,flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)  #绘制前20个匹配结果
plt.imshow(img3)
plt.axis('off')
plt.show()

暴力匹配器对象的knnMatch方法可返回指定数量的最佳匹配结果:

ms=bf.knnMatch(des1,des2,k=n)
ms是返回的匹配结果列表,每个列表元素是一个子列表,包含了由参数k指定个数的DMatch对象;
des1查询描述符;des2训练描述符;k是返回的最佳匹配个数
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('cat.png',cv2.IMREAD_GRAYSCALE)
img2=cv2.imread('catface.png',cv2.IMREAD_GRAYSCALE)
orb=cv2.ORB_create()   #创建ORB检测器
kp1,des1=orb.detectAndCompute(img1,None)  #检测关键点和计算描述符
kp2,des2=orb.detectAndCompute(img2,None)  #检测关键点和计算描述符
bf=cv2.BFMatcher_create(cv2.NORM_HAMMING,crossCheck=False)  #创建匹配器,Flase
ms=bf.knnMatch(des1,des2,k=2)    #执行特征匹配
#应用比例测试选择要使用的匹配结果
good=[]
for m,n in ms:
    if m.distance<0.75*n.distance:    #因为k=2,所以这里要比较两个匹配结果的距离
        good.append(m)
img3=cv2.drawMatches(img1,kp1,img2,kp2,good[:20],None,flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)  #绘制前20个匹配结果
plt.imshow(img3)
plt.axis('off')
plt.show()

3.2 FLANN匹配器

FLANN是近似最近邻的快速库,该算法比其他最近邻算法更快。创建该匹配器时需传递两个字典参数:index_params、search_params。

①index_params用于指定索引树的算法类型和数量。SIFT和SURF与ORB特征算法的指定代码不同。SIFT和SURF用下面代码:

FLANN_INDEX_KDTREE=1
index_params=dict(algorithm=FLANN_INDEX_KDTREE,tree=5)

ORB算法可用下面代码:

FLANN_INDEX_LSH=6
index_params=dict(algorithm=FLANN_INDEX_LSH,
                  table_number=6,
                  key_size=12,
                  multi_probe_level=1)

②search_params用于指定索引树的遍历次数,遍历次数越多匹配越精确,通常50即可:

search_params=dict(checks=50)

示例代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('cat.png',cv2.IMREAD_GRAYSCALE)
img2=cv2.imread('catface.png',cv2.IMREAD_GRAYSCALE)
orb=cv2.ORB_create()   #创建ORB检测器
kp1,des1=orb.detectAndCompute(img1,None)  #检测关键点和计算描述符
kp2,des2=orb.detectAndCompute(img2,None)  #检测关键点和计算描述符
#定义FLANN参数
FLANN_INDEX_LSH=6
index_params=dict(algorithm=FLANN_INDEX_LSH,
                  table_number=6,
                  key_size=12,
                  multi_probe_level=1)
search_params=dict(checks=50)
flann=cv2.FlannBasedMatcher(index_params,search_params)  #创建FLANN匹配器
matches=flann.match(des1,des2)  #执行匹配操作
draw_params=dict(matchcolor=(0,255,0),#设置关键点和连接线为绿色
                 singlePointColor=(255,0,0),#设置单个点为红色
                 matchesMask=None,
                 flags=cv2.DrawMatchesFlags_DEFAULT)
img3=cv2.drawMatches(img1,kp1,img2,kp2,matches[:20],None,flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
plt.imshow(img3)
plt.axis('off')
plt.show()


4、对象查找

经过上面的操作得到最佳匹配结果后,可调用cv2.findHomography()函数执行查询图像和训练图像的透视关系,再调用cv2.perspectiveTransform()函数执行向量的透视矩阵转换,即可得查询图像再训练图像中的位置。

①cv2.findHomography()函数格式:

retv,mask=cv2.findHomography(srcPoints,dstPoints,method,ransacReproThreshold)

retv为返回的转换矩阵;mask是返回的查询图像在训练图像中的最佳匹配结果掩膜。srcPoints和dstPoints分别是查询和训练图像匹配结果的坐标。后两个是可选参数:method是用于计算透视转换矩阵的方法;ransacReproThreshold是可允许的最大重投影误差。

②cv2.perspectiveTransform()函数格式:

dst=cv2.perspectiveTransform(src,m)

dst是输出结果数组,大小和类型与src相同。src是输入的2通道或3通道浮点类型的数组;m是大小为3x3或4x4的浮点类型的转换矩阵,例如使用cv2.findHomography()函数返回的转换矩阵。

示例代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('cat.png',cv2.IMREAD_GRAYSCALE)
img2=cv2.imread('catface.png',cv2.IMREAD_GRAYSCALE)
orb=cv2.ORB_create()   #创建ORB检测器
kp1,des1=orb.detectAndCompute(img1,None)  #检测关键点和计算描述符
kp2,des2=orb.detectAndCompute(img2,None)  #检测关键点和计算描述符
bf=cv2.BFMatcher_create(cv2.NORM_HAMMING,crossCheck=True)  #创建匹配器,True
ms=bf.match(des1,des2)    #执行特征匹配
ms=sorted(ms,key=lambda x:x.distance)  #按距离排序
matchesMask=None
if len(ms) > 10:  #在有足够数量的匹配结果后,才计算查询图像在训练图像中的位置
    querypts=np.float32([kp1[m.queryIdx].pt for m in ms]).reshape(-1,1,2)#计算查询图像匹配结果的坐标
    trainpts=np.float32([kp2[m.trainIdx].pt for m in ms]).reshape(-1, 1, 2)  # 计算训练图像匹配结果的坐标
    retv,mask=cv2.findHomography(querypts,trainpts,cv2.RANSAC)  #执行查询图像与训练图像的透视转换
    matchesMask=mask.ravel().tolist()  #计算最佳匹配结果的掩模,用于绘制匹配结果
    h,w=img1.shape
    pts=np.float32([[0,0],[0,h-1],[w-1,h-1],[w-1,0]]).reshape(-1, 1, 2)
    dst=cv2.perspectiveTransform(pts,retv)  #执行向量的透视矩阵转换,获得查询图像在训练图像中的位置
    img2=cv2.polylines(img2,[np.int32(dst)],True,(255,255,255),5)  #用白色矩形在训练图像中绘制出查询图像的范围
img3=cv2.drawMatches(img1,kp1,img2,kp2,ms,None,
                     matchColor=(0,255,0),  #用绿色画出匹配结果
                     singlePointColor=None,
                     matchesMask=matchesMask,  #绘制掩模内的匹配结果
                     flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
plt.imshow(img3)
plt.axis('off')
plt.show()

只有在找到足够多的匹配结果后,才能确定查询图像在训练图像中的位置,此处if设置为10.满足条件后根据特征匹配结果执行透视变换,获得查询图像在训练图像中的位置,再用绘图函数绘制出位置。为满足条件时,此例只绘制特征匹配结果,不会绘制位置。


总结:

由于是初学者可能很多地方没有总结完全或者有误,后续深入学习后会不断回来该删,也欢迎各位朋友指正!下次学习人脸检测和识别

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

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

相关文章

【实战】MySQL百万数据优化

业务场景 一般在项目开发中会有很多的统计数据需要进行上报分析&#xff0c;一般在分析过后会在后台展示出来给运营和产品进行「分页查看」&#xff0c;「最常见的一种就是根据日期进行筛选」。这种统计数据随着时间的推移数据量会慢慢的变大&#xff0c;达到百万、千万条数据只…

即时通讯APP开发费用成本多少?

移动互联网的发展&#xff0c;为人们的通讯交流提供了非常多的便利&#xff0c;一些即时通讯APP的出现&#xff0c;将人与人的距离再一次缩短。通过即时通讯APP软件&#xff0c;人们可以随时随地了解身边发生的新鲜事物&#xff0c;以及和朋友探讨各类趣事&#xff0c;甚至可以…

Kubernetes高可用集群

Kubernetes高可用集群 0、服务器信息 服务器为腾讯云服务器&#xff08;按需计费&#xff0c;按流量计费&#xff0c;并且将IP转换为弹性IP&#xff0c;使用结束可关机仅收取硬盘等固定资源费用&#xff09; 服务器名称IP描述Kuernetes-149.235.103.143master1Kuernetes-249…

黑熊“光临”美国小学,校长惊慌失措,转身就跑

最近&#xff0c;一则有趣的视频在网络上传播。一个平凡的清晨&#xff0c;美国西维吉尼亚州尼古拉斯县的萨拉小学校长马什遭遇了一次前所未有的惊险经历。 这位校长本想打开垃圾桶&#xff0c;却突然发现一头黑熊钻出了垃圾桶&#xff0c;这让他吓得跑得飞快。与此同时&#…

K8S通过Ansible安装集群

K8S通过Ansible安装集群 K8S集群安装可参考https://gitee.com/open-hand/kubeadm-ha.git、https://github.com/easzlab/kubeasz.git 安装高可用集群 git clone https://gitee.com/open-hand/kubeadm-ha.git && cd kubeadm-ha升级内核,非必需&#xff0c;默认不升级&…

二叉树原理

二叉树原理TOC 二叉树是公认的难解型数据结构&#xff0c;这里试着系统化的讨论一些与二叉树有关的内容&#xff1a; 二叉树的数据标记方法&#xff1a;层次数据&#xff08;int t[N];&#xff09;,左右树标记&#xff08;bool lr:0standForL, 1standForR&#xff09;&#xf…

算法之路--冒泡排序算法

写在前面 很早就想系统梳理所接触的所有算法&#xff0c;但是只是存在于一个想法阶段&#xff0c;懒惰使人遗忘不是么。作为一个软件开发人员&#xff0c;绕不开算法与数据结构&#xff0c;既然绕不开&#xff0c;何不逐一分析学习透彻&#xff0c;与君共勉之。 冒泡排序算法&a…

单片机c51中断 — 中断嵌套实例IE0的置位和撤销

项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第五章&#xff0c;中断 根据下原理图&#xff0c;编程验证二级外部中断嵌套效果。其中K0定为低优先级中断源&#xff0c;K1为高优先级中断源。此外&#xff0c;利用发光二极管D1验证外部中断请求标志IE0在脉…

Minio(minio-20221029062133.0.0.x86_64.rpm) Linux 环境安装

Minio Linux 环境安装 资源下载 镜像下载地址&#xff1a;http://dltest.minio.org.cn/server/minio/release/linux-amd64/archive/ 资源包下载地址&#xff08;与献文匹配&#xff09;&#xff1a;https://download.csdn.net/download/scdncby/87769604 安装 上传rpm安装…

React+Antd+Vite+TypeScript 项目实战教程

本教程属于react入门教程&#xff0c;课程围绕如何搭建一个项目框架展开&#xff0c;会带你快速了解react、redux、redux-devtool、react-router-dom、axiox这些常见技术的使用方式&#xff0c;教程最后会附上项目源码。 一、创建项目 在搭建项目时&#xff0c;我们通常会使用…

day38_JDBC

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、数据库连接池 二、反射 三、封装DBUtil 零、 复习昨日 SQL注入 预处理语句 String sql "select * from user where id ?"; PreparedStat…

Spring Boot访问数据库

SpringBoot访问数据库时&#xff0c;我们可以使用以下三种&#xff0c;JdbcTemplate、Spring Boot Data Jpa、mybatis。 JdbcTemplate是Spring自己提供的&#xff0c;但是其操作不方便&#xff0c;甚至有些繁琐&#xff0c;在实际应用中也是很少会使用&#xff0c;所以这里就不…

使用MobaXterm在Windows系统远程Ubuntu系统

使用场景 通常大部分办公软件都安装在Windows系统上&#xff0c;使用Windows系统办公更便捷&#xff0c;并且大多办公软件在Ubuntu系统上不兼容&#xff0c;即使进行处理&#xff0c;使用体验也不好&#xff0c;下面针对在同一局域网使用Windows远程Ubnuntu进行ssh、VNC和打开…

Nature -- 空间表观组学与转录组学联合分析,揭示基因表达的精准调控

为充分理解组织中单细胞的基因表达调控&#xff0c;需要在单细胞水平以空间分辨率的方式集成不同分子信息的不同层面&#xff0c;包括表观基因组和转录组数据。虽然单细胞多组学方法可以捕捉来自不同分子层的信息&#xff0c;但是空间组学方法到目前为止主要局限于一层分子。张…

MATLAB的无人机遥感数据预处理与农林植被性状估算实践

在新一轮互联网信息技术大发展的现今&#xff0c;无人机、大数据、人工智能、物联网等新兴技术在各行各业都处于大爆发的前夜。为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节&#xff0c;逐步摆脱人力依赖&#xff1b;在施肥灌溉环节构建智慧节能系统&a…

ASP.NET core WebApi Cors跨域解决

前言 我用了最新版的Asp.net webapi &#xff0c;在csdn上面搜跨域如何解决的时候&#xff0c;发现csdn上面对于.NET技术讨论不是很多。没办法&#xff0c;只能面向官方文档和GitHub编程了。 项目类型确认 NuGet包引入 前面两个已经放弃维护了&#xff0c;我们就不用了。用最…

使用Actor-Critic的DDPG强化学习算法控制双关节机械臂

在本文中&#xff0c;我们将介绍在 Reacher 环境中训练智能代理控制双关节机械臂&#xff0c;这是一种使用 Unity ML-Agents 工具包开发的基于 Unity 的模拟程序。 我们的目标是高精度的到达目标位置&#xff0c;所以这里我们可以使用专为连续状态和动作空间设计的最先进的Deep…

【uni-app】errMsg : navigateTo:fail can not navigateTo a tabbar page报错解决方案

文章目录 前言一、报错二、解决方案更改api 总结 前言 大家好&#xff0c;今天在进行uni-app项目开发时&#xff0c;在进行页面跳转的时候报了一个错误&#xff0c;一开始觉得只是个小报错就没有仔细看这个报错&#xff0c;直接就到页面检查看是不是跳转没写好&#xff0c;但是…

Spring IOC:详解【依赖注入数值问题 依赖注入方式】

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 spring版本&#xff1a;5.3.1 文章目录 Spring系列专栏文章目录一、Spring依赖注入数值问题1.1 字面量数值问…

计算机网络 | 广播与组播

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…