暂时未有相关云产品技术能力~
一、日志方法我们先来演示一下Log.d()的用法:它需要传入两个参数,第一个参数是tag,一般传入当前的类名就好,主要用于对打印信息进行过滤;第二个参数是msg,即想要打印信息的具体内容。Log.d("MainActivity","Hello Debug"); 我们运行之后来看下控制台Logcat的内容: 不仅包含了打印日志内容和tag名,还有包含程序的包名、打印时间以及应用进程的进程号。二、快捷键对于java选手来说,sout就是最喜欢的快捷键。那么对于Android选手,打印日志也有快捷键,只需要输入logd,然后按下Tab键,就会自动帮你补全一条完整的打印语句。同理,输入logi、logw等等。另外,由于Log的所有打印方法都要求传入一个tag参数,每次都写一遍显然太过麻烦,这里有个小技巧,我们在onCreate()的方法外面输入logt,然后按下Tab键补全,自动生成一个TAG常量。三、过滤器除了快捷键以外,logcat中还可以轻松添加过滤器,可以看到目前我们所有的过滤器:目前有4个过滤器:show only selected application表示只显示当前选中程序的日志。Firebase是谷歌提供的一个分析工具,我们可以不用管它。No Filters相当于没有过滤器,会把所有日志显示出来。Edit Filter Configuration是自定义过滤器,比如下面的MainActivity就是我自定义的一个过滤器。我们来演示下如何自定义过滤器:点击Edit Filter Configuration,会弹出一个过滤器配置界面。如何给过滤器起名为MainActivity,并且让它对MainActivity的tag进行过滤。我们点击这个过滤器,发现我们的日志被筛选为先几条tag名为MainActivity的日志了。四、日志级别控制学完了过滤器,我们再来看下logcat中日志级别的控制吧。logcat主要有6个级别,在第一部分中已经介绍过了。给大家整理了一下日志等级表:当选择级别是verbose时,也就是最低等级。不管我们使用哪一个方法打印日志,这条日志一定会显示出来。如果我们选中debug,那么只有使用debug以上级别的方法打印的日志才会显示出来,以此类推。String returnData=data.getStringExtra("data_return"); Log.v(TAG,returnData); Log.d(TAG,returnData); Log.i(TAG, returnData); Log.w(TAG, returnData); 我们运行程序,打印以上四种级别的信息,此时选择verbose级别:我们选择info等级,发现只显示info以及warn的日志:五、关键字过滤使用关键字可以进一步过滤我们想看的日志信息,而且关键字过滤支持正则表达式,有了这个特性,我们可以构建出更加丰富的过滤条件。
一、查看进程1、ps aux查看所有进程的详细信息2、ps a | grep 进程名查询进程名对应的进程信息。3、netstat -nlp查看所有处于网络连接的进程,适合服务器端使用。4、pstree树状显示进程信息,便于查看子进程和父进程。二、关闭进程我们可以通过上一步查看的进程号pid关闭进程,执行以下任一指令即可关闭该进程:1、kill pid关闭进程。2、kill -9 -pid强制关闭进程。3、kill -KILL pid更加强制关闭进程。当然,我们也可以通过进程名command来关闭进程。执行下面任一指令即可关闭该进程:1、pkill 进程名 关闭进程。2、killall 进程名 关闭同一进程组内的所有进程。
1、首先查看Mysql的依赖项:dpkg --list|grep mysql2、输入sudo apt-get autoremove --purge mysql-server会弹出下面的卸载窗口,点击Yes即可删除所有mysql的工作目录3、输入sudo apt-get remove mysql-common ,删除mysql的软件包4、输入dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P ,清空mysql的配置文件5、最后别忘了输入sudo apt-get update更新软件源,只要是安装或卸载软件,都要执行下此命令。至此,Mysql5.7就卸载干净了。
踩坑1下列签名无效: EXPKEYSIG 8C718D3B5072E1F5 MySQL Release Engineeringmysql-build@oss.oracle.comW: GPG 错误:http://repo.mysql.com/apt/ubuntu bionic InRelease: 下列签名无效:EXPKEYSIG 8C718D3B5072E1F5 MySQL Release Engineeringmysql-build@oss.oracle.com E: 仓库 “http://repo.mysql.com/apt/ubuntubionic InRelease” 没有数字签名。N: 无法安全地用该源进行更新,所以默认禁用该源。N: 参见apt-secure(8) 手册以了解仓库创建和用户配置方面的细节。解决1我使用了网上访问量20万的那篇博客中的下面签名,但试了好几次还是报错:sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8C718D3B5072E1F5。然后还有gpg各种方法,都试过无果。查了200多个链接后,终于找到适合我的解决办法了,就是sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8C718D3B5072E1F5 最后的数字签名就是你报错信息中的那串数字。踩坑2安装时无法出现该界面,一直卡在确认密码后的那个阅读条约界面。解决2–可以按alt+enter,就可以进入上面的界面了,这样就可以选择加密方式了。
安装GsonFormat插件安装非常简单:File—>Settings—>Plugins,然后搜索GSON,目前GSONFormat已经升级为GsonFormatPlus,所以选择它进行install。安装时会有提示,点击Accept,等待安装完成后点击OK关闭Setting界面即可。在你需要使用GSON的项目中,打开build.gradle(app),在dependencies中添加下面依赖,然后同步。这样就完成了所有配置。implementation 'com.google.code.gson:gson:2.2.4' 使用1、新建一个PersonBean类。2、右击Generate,然后打开GsonFormatPlus3、出现如下的JSON数据查看框。4、先不着急格式化生成,因为Plus有许多改动,生成的和我们想要的数据格式有很大出入,所以点击左下角的Setting,然后按下图勾选好。5、将需要解析的数据放到左侧的输入框中。6、点击Format,进行格式化,发现数据变得很规整。7、点击OK,开始生成实体类,展示键的名称和类型。8、再点击一下OK,一个实体类就帮你生成好了!在线JSON校验格式化工具也可以方便快速地帮我们将杂乱的json数据进行格式化。
1、Alt+T打开终端,输入sudo ufw status回车,查看防火墙状态,inactive是关闭,active是开启。2、使用sudo ufw enable开启防火墙。3、使用sudo ufw disable关闭防火墙。
1、安装包下载进入官网下载自己需要的版本,我这里下载的是5.9.0,选择linux版本qt-opensource-linux-x64-5.9.0.run。下载完成后,我们将它重命名为QT5.9.02、安装1、先修改用户权限,cd到安装包的目录,然后输入sudo chmod a+x QT5.9.0回车2、输入sudo ./QT5.9.0回车开始安装,然后下一步3、输入Qt的账号和密码,然后回车4、进入配置向导界面,下一步5、选择安装路径,默认就可以6、这一步勾上这两个7、同意协议,下一步8、开始安装,等待安装9、安装成功三、配置环境1、sudo vim /etc/bash.bashrc2、在文件的最后添加如下内容export QTDIR=/opt/Qt5.9.0/5.9/gcc_64 export PATH=$QTDIR/bin:$PATH export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH3、保存后执行如下命令source /etc/bash.bashrc
一、项目概述本次项目实现了一个简单的网络视频播放器,调用的是高度自定义的视频框架jiaozivideoplayer。通过gson解析网络视频的api,获取每个视频的url、点赞量和评论数。获取到数据源后,我们再创建适配器,给列表设置下适配器,加载网络数据,从而实现了网络视频的播放。二、开发环境三、项目结构HttpUtils是获取Http请求的工具类MainActivity是主活动,在其中让子线程发送消息提醒适配器更新数据VideoAdapter是创建的视频播放适配器VideoBean是GsonFormat自动解析生成的实体类四、运行演示1、打开应用,启动界面就是网络视频列表,每条视频的左下角是作者头像、姓名和简介,右下角是贫评论数和收藏数。2、选择想看的视频,点击视频进行播放。3、还可以拖动进度条来快进视频。4、详细的演示视频如下:Android网络视频播放器五、项目总结本次网络视频播放器项目主要考验大家对Json数据的解析与运用,属于中等难度的知识点,熟悉之后就可以获取各个api的数据源了。这些知识点在今后的Android项目中会经常使用,因此希望大家能够熟练掌握Json的使用,方便后续开发项目。六、源码获取点此下载源码:👉Android Studio实现简单的网络视频播放器👈☀️ 还可以关注下方博主的公众号,后台回复:视频播放器 ☀️
0、准备工作右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库,import numpy并且重命名为np。import cv2 import numpy as np我们还要知道在OpenCV中,坐标轴的方向是x轴向右,y轴向下,坐标原点在左上角,比如下面这张长为640像素,宽为480像素的图片。OK,下面开始本节的学习吧。1、场景描述给定任意一张图像,从中分割出你需要的区域,并且以指定的大小显示出来。而且分割出的图像在线性空间中还是与显示的窗口是平行的。就比如:我想要获取下面的K,原图中K是斜躺着的,分割后显示出来应该是竖直站立的。那么该如何实现这样的效果呢?在实现上述效果前,我们需要获取些重要信息,比如说上图中扑克牌K的四个坐标点。我们可以使用画图工具打开这张图片,然后将鼠标放置在分割区域的四个点上,即可获取到坐标信息。因为画图中图像的宽高坐标轴和OpenCV是一样的, 当我将鼠标放到K左上角时,画图的左下角就显示出来(734像素,185像素), 这就是左上角这个点的坐标2、透视变换上面的要求实现看起来比较困难,但是用cv2库,实现起来其实只有9行代码。首先我们设置下输出图片的宽width为250,高height为350。然后读取我们的图片,就是上面这张图。定义目标区域的四个点坐标,分别为:左上、右上、左下、右下。我们在上一步已经获取到了。pst2是输出图片在图片框中的位置,选择平铺即可,固定写法。使用库函数warpPerspective实现透视变换,感兴趣的可以深入了解下原理。最后输出并且显示两张图像。width,height=250,350 img=cv2.imread("Resources/poker.jpg") pst1=np.float32([[734,185],[1101,266],[621,679],[1030,789]]) pst2=np.float32([[0,0],[width,0],[0,height],[width,height]]) matrix=cv2.getPerspectiveTransform(pst1,pst2) imgOutput=cv2.warpPerspective(img,matrix,(width,height)) cv2.imshow("Image",img) cv2.imshow("Output",imgOutput) cv2.waitKey(0)我们来看下效果,左图是我们透视变换的图像,右图是原图像:第五节的内容,其实很有趣,在生活中有很多应用。眼过千遍不如手过一遍,快去动手敲一遍吧~
报错信息19:50:42.751: QSqlDatabase: QMYSQL driver not loaded 19:50:42.751: QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QPSQL QPSQL7 19:50:42.751: open fail "Driver not loaded" 19:50:42.752: HTTP server listen: true 19:50:42.752: HTTP server2 listen: true 19:50:42.752: HTTP server3 listen: true 19:50:42.752: QSqlDatabase: QMYSQL driver not loaded 19:50:42.752: QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QPSQL QPSQL7 19:50:42.752: open fail "Driver not loaded" 19:50:42.752: All Down 报错截图解决方法发现,Qt缺少一个动态链接库,从官网下载一个libmysqlclient.so.18:https://launchpad.net/ubuntu/xenial/amd64/libmysqlclient18/5.6.25-0ubuntu1下载完成之后,cd到文件目录,进行安装sudo dpkg -i libmysqlclient18_5.6.25-0ubuntu1_amd64.deb 再次编译运行项目,成功加载mysql引擎,没有出现相关报错。
1、打开我之前介绍过的DiskGenius,找到Ubuntu的分区,可以看到自己分出的/根目录、/home用户目录、swap交换分区和temp恢复分区。2、找到要保存的文件所在的分区和目录。3、右键文件夹选择复制到指定文件夹,然后等待复制完成就好。
问题描述在安装cmake-qt-gui时,出现了软件包依赖问题:正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是 因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件 包尚未被创建或是它们已被从新到(Incoming)目录移出。 下列信息可能会对解决问题有所帮助: 下列软件包有未满足的依赖关系: cmake-qt-gui : 依赖: cmake (= 3.10.2-1ubuntu2) E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。 然后在终端安装上面需要的 cmake = 3.10.2-1ubuntu2依赖时,又出现问题:解决方案其实这类问题解决起来和递归的思想相同,自顶向下找到缺少的依赖关系,到达最底层时就可以安装好所缺依赖,这时候就一直返回上面的每层进行安装,最终解决问题。1、可以看到上面说缺少cmake-data(= 3.10.2-1ubuntu2),所以我们在终端输入:sudo apt install cmake-data= 3.10.2-1ubuntu2 回车,发现安装成功:2、这时候我们再输入sudo apt install cmake-3.10.2-1ubuntu2,回车,安装成功。3、最后,我们再输入sudo apt install cmake-qt-gui,回车,安装成功!
一、Qt简介1、什么是QtQt是一个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面所需的所有功能,它是完全面向对象的很容易扩展;并且允许真正的组件编程。2、Qt的发展史1991年,Qt最早由奇趣科开发。2014年4月,跨平台的集成开发环境Qt Creater3.1.0发布,同年发布Qt5.3正式版,至此,Qt实现了对iOS、Android、WP等各平台的全面支持。3、Qt的优点跨平台,几乎支持所有平台接口简单,容易上手,学习Qt框架对学习其他框架有参考意义一定程度上简化了内存回收机制开发效率高,能够快速构建应用程序有很好的社区氛围,市场份额缓慢上升可以进行嵌入式开发4、Qt的成功案例Linux桌面环境KDEWPS Office办公软件Skype网络电话Google Earth谷歌地图VLC多媒体播放器VirtualBox虚拟机软件二、Qt下载Qt 5.9 之后的安装包与之前相比,不再区分 VS 版本和 MinGW版本,而是全都整合到了一个安装包中。因此,与之前的安装包相比,体积也是大了不少,以前是 1G 多,现在是 3G 多。首先进入Qt下载官网,选择我们需要安装的版本,这里我想安装的是5.12大版本,小版本是6,所以我下载的就是5.12.6的windows版本。如果官网下载链接很慢,可以选择到清华大学开源软件镜像站下载安装包:v三、Qt安装1、打开下载好的安装程序,然后点击Next。2、如果没有Qt账号的可以注册一下账号,然后进行登录。然后点击Next。3、验证成功后来到这一界面,依旧是傻瓜式下一步。4、更换安装路径,尽量不要安装在C盘,我在D盘的文件夹中创建了一个Qt5.12.6文件夹,然后Next。5、进入选择组件界面,在这里务必选对Qt安装所需组件,否则安装后是无法正常运行的。先点击各项前面的>箭头展开组件内容。6、 这里我们选择MinGW进行编译,其他组件对于初学者来说并不需要安装。7、 再看Tools,这里我们默认选择CDB即可,然后下一步。8、然后选择agree,点击下一步。创建开始菜单快捷方式,点击下一步。9、点击安装,等待安装完成。至此,Qt就安装完成了!一套下来就是组件安装时需要注意一下,其他都是下一步。10、安装完成,开启你的Qt之旅吧~
问题描述安装ros时,在到最后一步 rosdep 初始化时,多半会抛出异常。这是因为境外资源被屏蔽。百度或google搜索,解决方式有多,可惜墙加高了,现在集体失效。所以我特地来总结下ros大神推荐的方法,思路就是将要下载的资源链接到gitee上,这样就不怕连接超时了。解决方法1、进入/usr/lib/python3/dist-packages/ 查找rosdep中和raw.githubusercontent.com相关的内容,调用命令:find . -type f | xargs grep "raw.githubusercontent"2.sudo gedit命令分别修改下面这四个文件:./rosdistro/_ _ init _ _.py./rosdep2/gbpdistro_support.py./rosdep2/sources_list.py./rosdep2/rep3.py。3、文件中涉及的 URL 内容,如果是raw.githubusercontent.com/ros/rosdistro/master,都替换成gitee.com/zhao-xuzuo/rosdistro/raw/master。4、然后重新执行命令:sudo rosdep init rosdep update 就可以正常实现 rosdep 的初始化与更新了!5、如果再次rosdep update失败的话,检查刚刚四个文件的url是否全部修改好。如果检查一遍发现修改好了,那就将刚刚rosdep init生成的文件先删除,重新rosdep init,然后rosdep update,这样就成功了!
0、准备工作右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库。我们还要知道在OpenCV中,坐标轴的方向是x轴向右,y轴向下,坐标原点在左上角,比如下面这张长为640像素,宽为480像素的图片。OK,下面开始本节的学习吧。1、查看图像大小调用imread()方法获取我们资源文件夹中的图片lambo.png输出图像的shape属性img=cv2.imread("Resources/lambo.png") print(img.shape) 我们来看下效果:上图中462是图像的高度,也就是y轴;623是图像的宽度,也就是x轴;3是通道数,BGR(蓝绿红)通道2、重新调整图像大小resize()方法可以将图像调整到指定的宽和高,参数1是需要调整的图像img,参数2是(600,300),也就是新图像的宽和高。我们打印下imgResize的shape,看看是不是输出(300,600,3)。最后将原图和修改大小后的图像显示出来。img=cv2.imread("Resources/lambo.png") imgResize=cv2.resize(img,(600,300)) print(imgResize.shape) cv2.imshow("img",img) cv2.imshow("imgResize",imgResize) cv2.waitKey(0)我们来运行一下,可以看到右侧是调整后的图像,明显宽和高都比原图小:来看下控制台的输出,和图像大小是一样的:3、图像裁剪图像裁剪其实就是对矩阵进行截取,选哪些行哪些列,显示选中行列的像素点,就是裁剪后的图像。imgCropped=img[200:400,200:400]就是对原图进行裁剪,高从200到400,宽也从200到400,区间范围只要不超过它的高和宽即可。img=cv2.imread("Resources/lambo.png") imgCropped=img[200:400,200:400] cv2.imshow("img",img) cv2.imshow("imgCropped",imgCropped) cv2.waitKey(0) 我们运行看下效果,左侧是623X462的原图,右侧是200X200的裁剪图:我们将裁剪的图像放到原图上进行覆盖,可以拼成原图。第三节的内容也是比较简单的,主要是让大家熟悉下OpenCV最基础的应用,为后面打下基础。眼过千遍不如手过一遍,快去动手敲一遍吧~💘
0、准备工作右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库。1、转成灰度图像调用imread()方法获取我们资源文件夹中的图片lena.pngcvtColor()方法可以让我们的图片转换成任意颜色,第一个参数是我们要转换的图片,第二个参数是要转成的颜色空间,cv2.COLOR_BGR2GRAY就是由BGR变为GRAY,我们日常生活中都是RGB三通道顺序,而在OpenCV中是BGR顺序。使用imshow()方法显示图片,窗口名称为Gray ImagewaitKey(0)这句可以让窗口一直保持,如果去掉这句,窗口会一闪而过img=cv2.imread("Resources/lena.png") imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) cv2.imshow("Gray Image",imgGray) cv2.waitKey(0)我们来看下效果:2、高斯模糊GaussianBlur()是对图片进行高斯模糊(也称为高斯平滑),是去除图像噪声的一种方法。第一个参数是图像,第二个参数(7,7)是卷积核的大小,只能是奇数长度的矩阵,第三个参数是Sigma X,默认为0imshow()显示原图和灰度图img=cv2.imread("Resources/lena.png") imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) imgBlur=cv2.GaussianBlur(imgGray,(7,7),0) cv2.imshow("Gray Image",imgGray) cv2.imshow("Blur Image",imgBlur) cv2.waitKey(0) 我们来看下效果,左为原图,右是高斯模糊:3、边缘检测边缘检测Canny()方法中第一个参数是图像,第二个参数是阈值1,第三个参数是阈值2,用来显示灰度值在此范围内的边缘线。img=cv2.imread("Resources/lena.png") imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) imgBlur=cv2.GaussianBlur(imgGray,(7,7),0) imgCanny=cv2.Canny(img,150,200) cv2.imshow("Gray Image",imgGray) cv2.imshow("Blur Image",imgBlur) cv2.imshow("Canny Image",imgCanny) cv2.waitKey(0)我们运行看下效果:4、膨胀运算膨胀运算中,会用到numpy库,我们先导入一下:import numpy as np定义一下大小为5x5的卷积核:kernel=np.ones((5,5),np.uint8),数值类型是无符号整型kernel=np.ones((5,5),np.uint8) img=cv2.imread("Resources/lena.png") imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) imgBlur=cv2.GaussianBlur(imgGray,(7,7),0) imgCanny=cv2.Canny(img,150,200) imgDialation=cv2.dilate(imgCanny,kernel,iterations=1) cv2.imshow("Gray Image",imgGray) cv2.imshow("Blur Image",imgBlur) cv2.imshow("Canny Image",imgCanny) cv2.imshow("Dialation Image",imgDialation) cv2.waitKey(0)我们看下效果,膨胀使得边缘线变得更厚,全部连接到一块。5、腐蚀运算我们对刚刚膨胀的图像进行腐蚀运算,就可以得到闭合的边缘图像。kernel=np.ones((5,5),np.uint8) img=cv2.imread("Resources/lena.png") imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) imgBlur=cv2.GaussianBlur(imgGray,(7,7),0) imgCanny=cv2.Canny(img,150,200) imgDialation=cv2.dilate(imgCanny,kernel,iterations=1) cv2.imshow("Gray Image",imgGray) cv2.imshow("Blur Image",imgBlur) cv2.imshow("Canny Image",imgCanny) cv2.imshow("Dialation Image",imgDialation) cv2.waitKey(0)从左到右依次为膨胀图像、腐蚀图像、边缘检测图像
一、安装1、点击进入:夜神模拟器官网,然后点击下载。2、以管理员身份打开安装程序。3、打开右下角的【自定义安装】,选择要安装的路径,然后立即安装。4、等待安装完成即可,大概需要20s。二、使用1、设置模拟器机型与分辨率打开夜神模拟器,它默认是平板机型,因为我们需要在手机上运行Android项目,所以在设置中,将它改为手机型,同时可以调整手机的分辨率。 2、打开cmd命令行cd到夜神模拟器的安装目录,比如我的是D:\SoftMgr\Nox\bin。可以在上图所示的蓝色路径处输入cmd然后回车,效果是一样的。3、输入命令,连接Android Studio确保Android Studio和夜神模拟器都是打开的。然后输入nox_adb.exe connect 127.0.0.1:62001,回车,成功连接模拟器。可以看到Android Studio已经连接到我们的模拟器了:如果连接失败,重启模拟器。4、运行项目到夜神模拟器上点击运行按钮,就可以在夜神模拟器上进行安装了。
0、准备工作右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库。1、读取图像调用imread()方法获取我们资源文件夹中的图片使用imshow()方法显示图片,窗口名称为OutputwaitKey(0)这句可以让窗口一直保持,如果去掉这句,窗口会一闪而过############打开图像############ img=cv2.imread("Resources/lena.jpg") cv2.imshow("Output",img) cv2.waitKey(0)我们来看下效果:2、读取视频VideoCapture()方法的参数就是视频文件循环中通过read不断地去读视频的每一帧,再通过imshow显示出来最后if语句代表按q可以退出程序############打开视频############ cap=cv2.VideoCapture("Resources/video.mp4") while True: success,img=cap.read() cv2.imshow("Video",img) if cv2.waitKey(1)&0xFF==ord('q'): break我们来看下效果,视频播放速度会很快:3、网络摄像头如果是调用笔记本自带的摄像头,参数就为0;如果是外置USB摄像头,参数就为1。接着,设置一下摄像头窗口的宽高,参数3就代表的宽度,数值设置为640,参数4代表的高度,数值设置为480,参数10代表的亮度,数值设置为100。while循环中的和上面的读取视频是一样的,没有改动,作为模板。cap=cv2.VideoCapture(0) cap.set(3,640)#宽 cap.set(4,480)#高 cap.set(10,100)#亮度 while True: success,img=cap.read() cv2.imshow("Video",img) if cv2.waitKey(1)&0xFF==ord('q'): break 我们运行看下效果,可以看到笔记本前置摄像头打开(我拿本书挡住了,防止帅到你们):OK,第一节的内容还是非常简单的,主要是让大家熟悉下OpenCV最基础的应用。眼过千遍不如手过一遍,快去动手敲一遍吧~💘
问题背景博主使用VSCode每天写代码,工程目录放在VSCode的安装文件夹下,今天写完代码关闭VSCode后,发现工程文件夹找不到了,无论哪个盘都搜不到,然后上网百度了一下,发现如果不改设置的话,VSCode会自动更新,她的更新机制就是覆盖目录。所以当我把工程目录设置在VSCode文件夹时,就被自动更新覆盖掉了。解决方案1、下载磁盘管理工具DiskGenius,下载完解压就能使用了。无毒无害,功能强大,点击DiskGenius.exe就能打开软件。2、选中你想恢复的磁盘,然后【工具】—>【恢复丢失的文件】3、大概10s左右所有丢失的文件就被恢复好了,下面我们选中需要恢复的文件夹,复制到指定文件夹中即可。因为它复制的是最外层的根文件夹, 而我只想要它下面的VS文件夹中的文件, 所以当复制好VS文件夹时, 我就点了停止,并没有复制整个文件夹。 这个技巧先告诉大家,防止等待时间过长。 可以看到我的工程文件夹已经找回来了,赶紧移到其他文件夹中,防止再被覆盖。
一、国内专利点击进入国家知识产权局官网,选择常规搜索,输入需要查询的专利关键词进行查询:我们在输入关键词进行检索后,会跳转到检索结果界面。这里可以看到自己的检索历史可以对搜索结果进行过滤可以选择结果的显示方式,比如搜索式、列表式或者多图式申请号和申请人都显示在封面,可以对每份专利内容进行详细查看二、国外专利点击进入掌桥科研官网首页,输入搜索词,根据自己需要查询的范围,对底下的复选框进行勾选。外国专利界面,左侧上方有专利来源介绍,下方有专利分类,右侧为专利列表,点击可以查看详情。1、到国家知识产权局查询;2、到专业正规的中国专利网平台进行查询;3、通过espacenet检索系统来进行检索。
一、Pyplot简介Pyplot 是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API。Pyplot 是常用的绘图模块,能很方便让用户绘制 2D 图表。Pyplot 包含一系列绘图函数的相关函数,每个函数会对当前的图像进行一些修改,例如:给图像加上标记,生成新的图像,在图像中产生新的绘图区域等等。二、Pyplot导入我们可以使用 import 导入 pyplot 库,并设置一个别名 plt:from matplotlib import pyplot as plt 这样我们就可以使用 plt 来引用 pyplot 包的方法。三、Pyplot绘图✈️1、折线图from matplotlib import pyplot as plt import numpy as np xpoints=np.array([0,10]) ypoints=np.array([0,100]) plt.plot(xpoints,ypoints) plt.show()我们通过两个点(0,0)和(10,100)绘制出折线图,x轴的点坐标就是0和10,y轴的点坐标就是0,100。分别将x轴的点和y轴的点存放到数组中,再调用plot画在画布上,最后show显示出来就搞定了。🚄2、熟悉plot()函数plot() 用于画图它可以绘制点和线,语法格式如下:#画单条线 plot([x], y, [fmt], *, data=None, **kwargs) #画多条线 plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)x, y:点或线的节点,x 为 x 轴数据,y 为 y 轴数据,数据可以列表或数组。fmt:可选,定义基本格式(如颜色、标记和线条样式)。**kwargs:可选,用在二维平面图上,设置指定属性,如标签,线的宽度等。颜色字符:‘b’ 蓝色,‘m’ 洋红色,‘g’ 绿色,‘y’ 黄色,‘r’ 红色,‘k’ 黑色,‘w’ 白色,‘c’ 青绿色,’#008000’ RGB 颜色符串。多条曲线不指定颜色时,会自动选择不同颜色。线条样式:’‐’ 实线,’‐‐’ 破折线,’‐.’ 点划线,’:’ 虚线。标记字符:’.’ 点标记,’,’ 像素标记(极小点),‘o’ 实心圈标记,‘v’ 倒三角标记,’^’ 上三角标记,’>’ 右三角标记,’<’ 左三角标记 等等。纸上得来终觉浅,绝知此事要躬行,大家看下面几个实例就明白了。我们可以绘制任意数量的点,只需确保两个轴上的点数相同即可。绘制一条不规则线,坐标为 (1, 3) 、 (2, 8) 、(6, 1) 、(8, 10),对应的两个数组为:[1, 2, 6, 8] 与 [3, 8, 1, 10]。我们给线条变成红色,并且线条样式为虚线,再让每个点都被‘o’符号标记:from matplotlib import pyplot as plt import numpy as np xpoints=np.array([1, 2, 6, 8]) ypoints=np.array([3, 8, 1, 10]) plt.plot(xpoints,ypoints,'r--o') plt.show()可以看到plot中多了个参数'r--o',它其实就是刚刚的[fmt],分别代表了颜色字符r,线条样式–,标记字符o,这三者的顺序随意,个数随意,非常方便。这里参数改成了'.g-.',可以得知引号中第一个参数是符号标记‘.’ ; 第二个是颜色字符g ; 第三个是线条样式-. 。这样就变成了绿色的点划线,并且点都被标记出来了。plt.plot(xpoints,ypoints,'.g-.')如果我们不指定 x 轴上的点,则 x 会根据 y 的值来设置为 0, 1, 2, 3…N-1。from matplotlib import pyplot as plt import numpy as np ypoints=np.array([2, 6, 2, 6,2]) plt.plot(ypoints,'.c:') plt.show() 从下图可以看出 x 的值默认设置为 [0, 1, 2, 3, 4]。🚉 3、轴标签和标题我们可以使用 xlabel() 和 ylabel() 方法来设置 x 轴和 y 轴的标签。from matplotlib import pyplot as plt import numpy as np xpoints=np.array([1,2,3,4,5]) ypoints=np.array([5,3,8,5,9]) plt.plot(ypoints,'oc-') plt.xlabel('x-label') plt.ylabel('y-label') plt.show()我们可以使用 title() 方法来设置标题。from matplotlib import pyplot as plt import numpy as np xpoints=np.array([1,2,3,4,5]) ypoints=np.array([5,3,8,5,9]) plt.plot(ypoints,'oc-') plt.title('picture') plt.xlabel('x-label') plt.ylabel('y-label') plt.show()如果我们想使用中文显示标题和标签,只需要加入一行plt.rcParams['font.family']=['STFangsong'],这样就可以使用系统字体中的“仿宋”。from matplotlib import pyplot as plt import numpy as np plt.rcParams['font.family']=['STFangsong'] xpoints=np.array([1,2,3,4,5]) ypoints=np.array([5,3,8,5,9]) plt.plot(ypoints,'oc-') plt.title('折线图') plt.xlabel('博客写作时长') plt.ylabel('涨粉数') plt.show()此外我们还可以自定义字体的样式:from matplotlib import pyplot as plt import numpy as np plt.rcParams['font.family']=['STFangsong'] xpoints=np.array([1,2,3,4,5]) ypoints=np.array([5,3,8,5,9]) plt.plot(ypoints,'oc-') plt.title('折线图',size='30',color='#ABCDEF') plt.xlabel('数量',size='15',color='blue') plt.ylabel('价格',size='20',color='m') plt.show()用size设置字体大小;color设置字体颜色,可以缩写,可以完整写,也可以用rgb十六进制写。最后,我们可以修改标题与标签的定位:from matplotlib import pyplot as plt import numpy as np plt.rcParams['font.family']=['STFangsong'] xpoints=np.array([1,2,3,4,5]) ypoints=np.array([5,3,8,5,9]) plt.plot(ypoints,'oc-') plt.title('折线图',loc='right',size='30',color='#409882') plt.xlabel('数量',loc='left',size='15',color='blue') plt.ylabel('价格',loc='top',size='20',color='m') plt.show()title() 方法提供了 loc 参数来设置标题显示的位置,可以设置为: ‘left’, ‘right’, 和 ‘center’, 默认值为 ‘center’。xlabel() 方法提供了 loc 参数来设置 x 轴显示的位置,可以设置为: ‘left’, ‘right’, 和 ‘center’, 默认值为 ‘center’。ylabel() 方法提供了 loc 参数来设置 y 轴显示的位置,可以设置为: ‘bottom’, ‘top’, 和 ‘center’, 默认值为 ‘center’。🚀 4、绘制多图我们可以使用 pyplot 中的 subplot() 和 subplots() 方法来绘制多个子图。subplot() 方法在绘图时需要指定位置,subplots() 方法可以一次生成多个,在调用时只需要调用生成对象的 ax 即可。推荐大家使用subplot即可。我们看下subplot函数的语法格式:subplot(nrows, ncols, index)subplot( )将整个绘图区域分成 nrows 行和 ncols 列,然后从左到右,从上到下的顺序对每个子区域进行编号 1…N ,左上的子区域的编号为 1、右下的区域编号为 N,编号可以通过参数 index 来设置。from matplotlib import pyplot as plt import numpy as np #plot1 xpoints=np.array([0,2,4,6,8]) ypoints=np.array([0,3,6,9,12]) plt.subplot(1,2,1) plt.plot(xpoints,ypoints) plt.xlabel('x') plt.ylabel('y') plt.title('plot1') #plot2 x=np.array([1,3,5,8]) y=np.array([10,3,6,2]) plt.subplot(1,2,2) plt.plot(x,y) plt.title('plot2',color='m') plt.show()可以看到plot1和plot2在用plot前都加上了plt.subplot(1,2,1)和plt.subplot(1,2,2),意思是说将画布分为一行两列,左边标号是1,右边标号是2,所以plot1就在左图位置,plot2就画在右图位置。就这么简单。如果我们只在第一块区域画图,将plot2代码删去,运行一下。from matplotlib import pyplot as plt import numpy as np #plot1 xpoints=np.array([0,2,4,6,8]) ypoints=np.array([0,3,6,9,12]) plt.subplot(1,2,1) plt.plot(xpoints,ypoints) plt.xlabel('x') plt.ylabel('y') plt.title('plot1') plt.show()可以看到只有plot1在画布的左侧,右侧没有图像,所以显示为空。🚤5、绘制散点图我们可以使用 pyplot 中的 scatter() 方法来绘制散点图。scatter() 方法语法格式如下:matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs) 🎉参数说明x,y:长度相同的数组,也就是我们即将绘制散点图的数据点,输入数据。s:点的大小,默认 20,也可以是个数组,数组每个参数为对应点的大小。c:点的颜色,默认蓝色 ‘b’,也可以是个 RGB 或 RGBA 二维行数组。marker:点的样式,默认小圆圈 ‘o’。cmap:Colormap,默认 None,标量或者是一个 colormap 的名字,只有 c 是一个浮点数数组的时才使用。如果没有申明就是 image.cmap。norm:Normalize,默认 None,数据亮度在 0-1 之间,只有 c 是一个浮点数的数组的时才使用。vmin,vmax:亮度设置,在 norm 参数存在时会忽略。alpha:透明度设置,0-1 之间,默认 None,即不透明。linewidths:标记点的长度。其实上面这些参数不需要全部记住,常用的大小颜色记住即可,收藏之后,忘记了随时来看。我们在画布上绘制下这8个点:import matplotlib.pyplot as plt import numpy as np x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) y = np.array([1, 4, 9, 16, 7, 11, 23, 18]) plt.scatter(x, y) plt.show()我们看下效果图:我们来设置散点的大小:import matplotlib.pyplot as plt import numpy as np x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) y = np.array([1, 4, 9, 16, 7, 11, 23, 18]) sizes = np.array([20,50,100,200,500,1000,200,100]) plt.scatter(x, y,sizes=sizes) plt.show()通过定义一个sizes数组,数组元素就是每个点的大小:我们还可以自定义点的颜色:import matplotlib.pyplot as plt import numpy as np x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) y = np.array([1, 4, 9, 16, 7, 11, 23, 18]) sizes = np.array([20,50,100,200,500,1000,200,100]) colors = np.array(["red","green","black","orange","purple","beige","cyan","magenta"]) plt.scatter(x, y,sizes=sizes,c=colors) plt.show()colors是颜色数组,存储了每个点的颜色:Matplotlib 模块提供了很多可用的颜色条。颜色条就像一个颜色列表,其中每种颜色都有一个范围从 0 到 100 的值。import matplotlib.pyplot as plt import numpy as np x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) y = np.array([1, 4, 9, 16, 7, 11, 23, 18]) sizes = np.array([20,50,100,200,500,1000,200,100]) colors = np.array([10, 20, 30, 40, 50, 60, 70, 80]) plt.scatter(x, y,sizes=sizes,c=colors,cmap='viridis') plt.colorbar() plt.show()设置颜色条需要使用 cmap 参数,默认值为 ‘viridis’,之后颜色值设置为 0 到 100 的数组。如果要显示颜色条,需要使用 plt.colorbar() 方法:以上就是所有pyplot的基本用法了,三连不迷路。
一、简介Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。Matplotlib可以用来绘制各种静态,动态,交互式的图表。Matplotlib 是一个非常强大的 Python 画图工具,我们可以使用该工具将很多数据通过图表的形式更直观的呈现出来。Matplotlib 可以绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等等。二、应用Matplotlib 通常与 NumPy 和 SciPy(Scientific Python)一起使用, 这种组合广泛用于替代 Matlab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。SciPy 是一个开源的 Python 算法库和数学工具包。SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。三、安装我们使用 pip 工具来安装 Matplotlib 库,如果还未安装该工具,可以参考: 一分钟学会Python中pip的安装与使用。在命令行中直接输入下面语句回车即可:pip install matplotlib然后输入pip show matplotlib回车查看是否已安装成功:在Python文件夹中我们可以这样导入它:import matplotlib 更多时候我们是导入它的pyplot并且取个洋气的别名:from matplotlib import pyplot as plt
想在图片上加上一些注释信息,怎么办?除了用画图工具,当然我们还可以用Python。首先,我们导入PIL的库和pyplot库。先读取当前工程文件夹下的图片,然后设置下字体样式和大小,这里字体样式是个通用路径,大家可以任意选择该路径下的字体,大小设置的是80。接着,我们设置下字体颜色,十六进制表示。下面一行是图片的分辨率,即宽高的像素个数,如果需要对照尺寸可以用到。核心代码就是draw.text()这一行,在(30,30)的位置写上字体大小80,粉红色的“Hello”。最后保存并显示出图片。完整源码如下:from PIL import Image,ImageDraw,ImageFont import matplotlib.pyplot as plt #打开图片 img = Image.open('beauty.jpg') draw = ImageDraw.Draw(img) #设置字体和大小 myfont = ImageFont.truetype('C:/windows/fonts/Arial.ttf', size=80) #设置字体颜色 fillcolor = "#CC3299" #读取图片的size,也就是宽度和高度 width, height = img.size #在(30,30)的位置开始写Hello draw.text((30,30),'Hello', font=myfont, fill=fillcolor) #保存图片 img.save('result.jpg') #显示图片 plt.imshow(img) plt.show()运行效果:
1️⃣作业要求给定一幅灰度图像,使用任意方法将其变成一幅彩色图像,并尽量使得添加的色彩显得较为真实。2️⃣核心代码import argparse import matplotlib import matplotlib.pyplot as plt from colorizers import * matplotlib.use('TKAgg') parser = argparse.ArgumentParser() parser.add_argument('-i','--img_path', type=str, default='imgs/ansel_adams3.jpg') parser.add_argument('--use_gpu', action='store_true', help='whether to use GPU') parser.add_argument('-o','--save_prefix', type=str, default='saved', help='will save into this file with {eccv16.png, siggraph17.png} suffixes') opt = parser.parse_args() # 加载上色器 colorizer_eccv16 = eccv16(pretrained=True).eval() colorizer_siggraph17 = siggraph17(pretrained=True).eval() if(opt.use_gpu): colorizer_eccv16.cuda() colorizer_siggraph17.cuda() # default size to process images is 256x256 # grab L channel in both original ("orig") and resized ("rs") resolutions img = load_img("imgs/test2.jpg") (tens_l_orig, tens_l_rs) = preprocess_img(img, HW=(256,256)) if(opt.use_gpu): tens_l_rs = tens_l_rs.cuda() # colorizer outputs 256x256 ab map # resize and concatenate to original L channel img_bw = postprocess_tens(tens_l_orig, torch.cat((0*tens_l_orig,0*tens_l_orig),dim=1)) out_img_eccv16 = postprocess_tens(tens_l_orig, colorizer_eccv16(tens_l_rs).cpu()) out_img_siggraph17 = postprocess_tens(tens_l_orig, colorizer_siggraph17(tens_l_rs).cpu()) plt.imsave('%s_eccv16.png'%opt.save_prefix, out_img_eccv16) plt.imsave('%s_siggraph17.png'%opt.save_prefix, out_img_siggraph17) plt.figure(figsize=(16,4)) plt.subplot(1,4,1) plt.imshow(img,aspect='auto') plt.title('Original') plt.axis('off') plt.subplot(1,4,2) plt.imshow(img_bw,aspect='auto') plt.title('Input') plt.axis('off') plt.subplot(1,4,3) plt.imshow(out_img_eccv16,aspect='auto') plt.title('Output (ECCV 16)') plt.axis('off') # plt.subplot(1,4,4) plt.imshow(out_img_siggraph17,aspect='auto') plt.title('Output (SIGGRAPH 17)') plt.axis('off') plt.show()3️⃣实验结果对随机选取的三张测试图片进行上色。首先第一张就是我们输入的原图,然后将输入的原图转为灰度图像,也就是第二张图片。接着我们使用16年ECCV的网络模型进行上色预测,得到处理后的结果,即第三张图片,最后我们使用17年siggraph快速着色器模型进行自动上色,得到第四张图的结果。通过对比可以看出,上色结果和原图相似度还是十分高的,而且没有任何违和感,效果很鲁棒。💖test1是周董,周董衣服及钢琴颜色完全相同,只是背景灯光不同而已。💝test2是蓝天白云,自然景物的还原度是最高的,几乎和原图无差别。(我估计GAN中的辨别器Discriminator都识别不出来这是上色的假图片。)💘test3是Taylor Swift,老霉依旧很美,上色后,和原图比起来,只是缺少些靓丽感。⭐实验源码+报告⭐
1️⃣作业需求选取5个尺度,36个方向共180个二维模板对一幅图像(任取,可用作业(1)的图像)分别做二维卷积,得到180幅滤波结果图像,以此作为基准Gabor滤波结果。由于这个基准算法处理速度很慢,故请试着对该方法进行改进,改进方法在要求得到同样180个卷积的结果图像的前提下,尽量提高其处理速度。2️⃣实现源码# coding:utf-8 import cv2 import numpy as np import pylab as pl from PIL import Image #构建Gabor滤波器 from joblib.numpy_pickle_utils import xrange def build_filters(): filters = [] ksize = [7,9,11,13,15] #gabor尺度 5个 lamda = np.pi/2.0 # 波长 # 三个参数 默认起点为0,终点为360,步长为10 for theta in np.arange(0,360,10): #gabor方向 36个方向 for k in xrange(5): kern = cv2.getGaborKernel((ksize[k],ksize[k]),1.0,theta,lamda,0.5,0,ktype=cv2.CV_32F) kern /= 1.5*kern.sum() filters.append(kern) return filters #滤波过程 def process(img,filters): accum = np.zeros_like(img) for kern in filters: fimg = cv2.filter2D(img,cv2.CV_8UC3,kern) np.maximum(accum,fimg,accum) return accum #特征图生成并显示 def getGabor(img,filters): image = Image.open(img) img_ndarray = np.asarray(image) res = [] #滤波结果 for i in xrange(len(filters)): res1 = process(img_ndarray,filters[i]) res.append(np.asarray(res1)) pl.figure(2) for temp in xrange(len(res)): pl.subplot(36,5,temp+1) #画36*5的格子显示出来 pl.imshow(res[temp],cmap='gray') pl.show() return res if __name__ == '__main__': filters = build_filters() getGabor('./dataset/image.png',filters) 其中image.png是我们要进行Gabor滤波处理的图片,也就是这张图片:3️⃣实验结果实验结果是36x5的图片序列,每一列从左到右代表[7,9,11,13,15]五个尺度。每一行从上至下代表0、10、20…340、350共36个维度。一共180幅滤波结果图像,使用的cv2的getGaborKernel进行优化,滤波处理的速度非常快。⭐实验源码+报告⭐当我们递归地实现 DFS 时,似乎不需要使用任何栈。但实际上,我们使用的是由系统提供的隐式栈,也称为调用栈(Call Stack)。
1️⃣作业要求将下图左右两种不同类型的纹理区域分开,方法输出结果是一幅与该图像等大小的二值图像,左边为0,右边为1,或者相反,灰色边框线在设计的方法中不作考虑,自行去除。2️⃣实现源码import matplotlib.image as mpimg import matplotlib.pyplot as plt import numpy as np from cv2 import cv2 from sklearn.multiclass import OneVsRestClassifier from sklearn.svm import SVR from skimage import feature as skft from PIL import Image,ImageDraw,ImageFont class Texture(): #n_point选取中心像素周围的像素点的个数 #radius选取的区域的半径 def __init__(self): self.radius = 1 self.n_point = self.radius * 8 #加载灰度图片 def loadPicture(self): train_index = 0 test_index = 0 train_data = np.zeros((10, 171, 171)) test_data = np.zeros((8, 171, 171)) train_label = np.zeros(10) test_label = np.zeros(8) for i in np.arange(2): image = mpimg.imread('dataset1/'+str(i)+'.tiff') data = np.zeros((513, 513)) data[0:image.shape[0], 0:image.shape[1]] = image index = 0 #图片分成9块,5块训练4块预测 for row in np.arange(3): for col in np.arange(3): if index < 5: train_data[train_index, :, :] = data[171*row:171*(row+1),171*col:171*(col+1)] train_label[train_index] = i train_index += 1 else: test_data[test_index, :, :] = data[171*row:171*(row+1),171*col:171*(col+1)] test_label[test_index] = i test_index += 1 index += 1 return train_data, test_data, train_label, test_label #纹理检测 def texture_detect(self): train_data, test_data, train_label, test_label = self.loadPicture() n_point = self.n_point radius = self.radius train_hist = np.zeros((10, 256)) test_hist = np.zeros((8, 256)) #LBP特征提取 for i in np.arange(10): # 使用LBP方法提取图像的纹理特征. lbp=skft.local_binary_pattern(train_data[i], n_point, radius, 'default') # 统计图像的直方图 max_bins = int(lbp.max() + 1) # hist size:256 train_hist[i], _ = np.histogram(lbp, normed=True, bins=max_bins, range=(0, max_bins)) for i in np.arange(8): lbp = skft.local_binary_pattern(test_data[i], n_point, radius, 'default') max_bins = int(lbp.max() + 1) # hist size:256 test_hist[i], _ = np.histogram(lbp, normed=True, bins=max_bins, range=(0, max_bins)) return train_hist, test_hist #训练分类器 SVM支持向量机分类 def classifer(self): train_data, test_data, train_label, test_label = self.loadPicture() train_hist, test_hist = self.texture_detect() #构建SVM支持向量机 svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1) model= OneVsRestClassifier(svr_rbf, -1) model.fit(train_hist, train_label) image=cv2.imread('dataset1/image.png',cv2.IMREAD_GRAYSCALE) image=cv2.resize(image,(588,294)) img_ku=skft.local_binary_pattern(image,8,1,'default') thresh=cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2) #对图像进行识别分类 img_data=np.zeros((1,98,98)) data=np.zeros((294,588)) data[0:image.shape[0],0:image.shape[1]]=image img = Image.open('texture.png') draw = ImageDraw.Draw(img) # 设置字体和大小 myfont = ImageFont.truetype('C:/windows/fonts/Arial.ttf', size=180) # 设置字体颜色 fillcolor = "#008B8B" # 读取图片的size,也就是宽度和高度 width, height = img.size #通过行列将图像分为九块 for row in np.arange(3): for col in np.arange(6): img_data[0,:,:]=data[98*row:98*(row+1),98*col:98*(col+1)] lbp= skft.local_binary_pattern(img_data[0], 8, 1, 'default') max_bins=int(lbp.max()+1) img_hist, _ = np.histogram(lbp, normed=True, bins=max_bins, range=(0, max_bins)) predict=model.predict(img_hist.reshape(1,-1)) if(predict==0): draw.text((width/6, height/6), '0', font=myfont, fill=fillcolor) data[98*row:98*(row+1),98*col:98*(col+1)]=0 else: draw.text((2*width /3, height/6), '1', font=myfont, fill=fillcolor) data[98*row:98*(row+1),98*col:98*(col+1)]=255 plt.subplot(211) plt.imshow(img_ku,'gray') #plt.subplot(312) #plt.imshow(thresh,'gray') plt.subplot(212) plt.imshow(img) plt.show() if __name__ == '__main__': test = Texture() # 计算分类准确度部分 accuracy = test.classifer() #print('Final Accuracy = '+str(accuracy)+'%') 3️⃣实验结果上面一张图是结果LBP算子特征提取后的图片,下面一张图使用SVM进行纹理分类后得到的结果,与预测的左上图纹理相同标为0,与右上图相同标为1。
1、重启Pycharm2、加入下面代码import matplotlib import matplotlib.pyplot as plt matplotlib.use('TKAgg')#加上这行代码即可,agg是一个没有图形显示界面的终端,常用的有图形界面显示的终端有TkAgg等
余弦距离我们来看下公式,其实就是余弦计算公式:A和B是两个任意向量,除以它们模的乘积,就得到它们夹角的余弦值,其中向量Ai和Bi是向量A和B的每一个分量。简单来说,余弦相似度,就是计算两个向量间的夹角的余弦值。余弦距离就是用1减去这个获得的余弦相似度。余弦值取值范围为[-1,1],余弦距离取值范围为[0,2],这样就满足了非负性的性质。是不是很简单~欧式距离欧式距离我们从初中或者说小学就开始使用了,就是计算距离空间中的两点的实际距离。这里的p为点(x1,y1)与点(x2,y2)之间的欧氏距离,当然扩展到多维空间中,公式就拓展到:是不是更简单~选择依据总体来说,欧氏距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异。统计两部剧的用户观看行为,用户A的观看向量为(0,1),用户B为(1,0);此时二者的余弦距很大,而欧氏距离很小;我们分析两个用户对于不同视频的偏好,更关注相对差异,显然应当使用余弦距离。而当我们分析用户活跃度,以登陆次数(单位:次)和平均观看时长(单:分钟)作为特征时,余弦距离会认为(1,10)、(10,100)两个用户距离很近;但显然这两个用户活跃度是有着极大差异的,此时我们更关注数值绝对差异,应当使用欧氏距离。
这里可以看到每种颜色的实色效果,还有颜色的英文名称,RGB三个通道的值,以及对应的十六进制。收藏码住,下次用到直接看就好了~
代码实现很简单,直接调库。import cv2 as cv from matplotlib import pyplot as plt #参数0表示以灰度图像读入该图片,也就是说在读取的同时就进行了处理 img = cv.imread('../dataset3/girl.bmp', 0) #img.ravel()指最终的直方图将对数据集进行统计,256是统计的区间分布,[0,256]是显示的区间 plt.hist(img.ravel(),256,[0,256]) plt.show() 运行效果如下:
第一种方法Python的cv2库中自带彩色转灰度的方法,而且非常简单,代码就9行,核心代码就1行。大题思路就是先读取一张彩色图片,然后在窗口中显示出来,再然后就让cv2处理一下,转换成灰度图像,这时候它是个二维的灰度矩阵,所以,我们想保存得先将它从array转成image,最后在另一个窗口中显示出来,为了避免窗口一闪而过,我们需要加上waitKey(0)这一句。import cv2 from PIL import Image #读取彩色图像 color_img = cv2.imread(r'dataset3/beauty.jpg') #在窗口中显示图像,该窗口和图像的原始大小自适应 cv2.imshow('original image',color_img) #cvtColor的第一个参数是处理的图像,第二个是RGB2GRAY gray_img=cv2.cvtColor(color_img,cv2.COLOR_RGB2GRAY) #gray_img此时还是二维矩阵表示,所以要实现array到image的转换 gray=Image.fromarray(gray_img) #将图片保存到当前路径下,参数为保存的文件名 gray.save('gray.jpg') cv2.imshow('Gray Image',gray_img) #如果想让窗口持久停留,需要使用该函数 cv2.waitKey(0) 第二种方法PIL中的Image库也自带转灰度图像的方法,然后再用pyplot显示在画布上就行了。一共8行代码,核心代码就1行。from PIL import Image from matplotlib import pyplot as plt color_img=Image.open('dataset3/beauty.jpg') gray_img=color_img.convert('L') plt.figure('beauty') plt.imshow(gray_img,cmap='gray') plt.axis('off') plt.show()
报错信息Python调用skimage库时报以下错,检查发现skicit-image库是安装的。解决方案1、打开Anaconda命令行,分别输入下面四条命令并回车。conda remove --force numpy conda remove --force scipy pip install -U numpy pip install -U scipy 下面是我的执行过程:2、再次回到Pycharm,等待环境检索更新后,运行程序,成功运行!
报错信息License for package Android SDK Build-Tools 28.0.3 not accepted.直译过来就是不接受Android SDK构建工具28.0.3包的许可证,因为没有接受许可证不能使用SDK进行构建,所以我们现在得接受许可证。解决方案1、找到自己的SDK文件夹,然后tools—>bin,在这个文件夹下cmd到命令行。2、输入命令 sdkmanager.bat --licenses,然后回车,会有7条注意事项需要确认,只要一直输入y回车就行。3、最后提示All SDK package licenses accepted的时候,就代表OK了
报错信息运行设备时错误:模拟器的进程终止了。解决方案1、File——>Setting——>Android SDK,看看这两项有没有安装,像下面这样就是安装好的。2、在系统环境变量中新建环境,变量名为Android_SDK_HOME,变量值为你的SDK路径。3、将C:\Users\Administrator.android这个文件夹为复制到SDK文件夹下,就是下图这个.android文件夹。这是复制到SDK文件夹后的样子。4、打开模拟器重新运行,如果不行重新创建一个API28的模拟器。
报错信息没有安装项目所需的SDK版本解决方案Tools——>Android SDK勾选右下角的框,如何选择28.0.3,然后再Apply点击OK等待安装完成即可。
报错信息解决方案打开app的build.gradle,找到下面的implementation的这一行,将后面的+号改成指定的版本号,比如1.2.0。所以,将上面红框的信息换成下面这行:implementation "androidx.core:core-ktx:1.2.0"
只要Tools——>AVD Manager——>卡住的模拟器——>Cold Boot Now即可。模拟器会自动重启,开机后一切正常。人一定要学会独立,思想独立、生活独立,最后经济独立,实现独立就是走向成熟。
问题描述很多同学导入我项目时会出现以下提示信息,提示信息是说这个项目的SDK路径(‘E:\ZERO’)没有找到,Android Studio会自动帮你切换到你自己的SDK路径,且自动修改local.properties文件。解决方案其实Android Studio已经帮你解决好了,不需要你手动修改任何东西,这只是个WARNING,不是ERROR。你可以看到你的local.prperties里面的sdk路径已经修改成你自己的了。
1、首先点击进入聚合数据的官网2、点击API,然后选择【免费接口大全】,可以看到这里有许多我们Android项目用到的接口,比如天气预报、星座运势、新闻头条、历史上的今天、老黄历等等。3、比如说,我们想申请一个API,就直接点击立即申请即可,每个接口次数都是有限制的,限量每天100次。4、我们申请完了之后,点右上角的【个人中心】,然后【数据中心】——>【我的API】,可以看到我们的key值,这样就可以在代码中进行请求了。接口的key值修改1、在我的天气预报Android项目中,想要更换接口,可以在URLUtils.java中直接换掉key值即可,其他不用变:public class URLUtils { public static final String KEY = "天气预报的key值"; public static String temp_url = "http://apis.juhe.cn/simpleWeather/query"; public static String index_url = "http://apis.juhe.cn/simpleWeather/life"; public static String getTemp_url(String city){ String url = temp_url+"?city="+city+"&key="+KEY; return url; } public static String getIndex_url(String city){ String url = index_url+"?city="+city+"&key="+KEY; return url; } } 2、中华字典,也是在URLUtils.java中进行修改,这里有两个key,一个是字典的key,还有一个是成语的key:public class URLUtils { public static String pinyinurl = "http://v.juhe.cn/xhzd/querypy?key="; public static String bushourul = "http://v.juhe.cn/xhzd/querybs?key="; public static final String DICTKEY = "字典的key"; public static String wordurl = "http://v.juhe.cn/xhzd/query?key="; public static final String CHENGYUKEY = "成语的key"; public static String chengyuurl = "http://v.juhe.cn/chengyu/query?key="; public static String getChengyuurl(String word){ String url = chengyuurl+CHENGYUKEY+"&word="+word; return url; } public static String getWordurl(String word){ String url = wordurl+DICTKEY+"&word="+word; return url; } public static String getPinyinurl(String word,int page,int pagesize){ String url = pinyinurl+DICTKEY+"&word="+word+"&page="+page+"&pagesize="+pagesize; return url; } public static String getBushouurl(String bs,int page,int pagesize){ String url = bushourul+DICTKEY+"&word="+bs+"&page="+page+"&pagesize="+pagesize; return url; } } 3、新闻APP,同样道理,在NewsURL.java中进行修改public class NewsURL { public static String key = "新闻头条的key"; public static String info_url = "http://v.juhe.cn/toutiao/index?key="+key+"&type="; // 头条 public static String headline_url = info_url +"top"; // 社会 public static String society_url = info_url +"shehui"; // 国内 public static String home_url = info_url +"guonei"; // 国际 public static String internation_url = info_url+"guoji"; // 娱乐 public static String entertainment_url = info_url+"yule"; // 体育 public static String sport_url = info_url+"tiyu"; // 军事 public static String military_url = info_url+"junshi"; // 科技 public static String science_url = info_url+"keji"; // 财经 public static String finance_url = info_url+"caijing"; // 时尚 public static String fashion_url = info_url+"shishang"; } 4、星座配对,以此类推,在URLContent中修改key,一个是星座配对的接口,还有一个是星座运势的接口。public class URLContent { // 星座配对接口 public static String getParnterURL(String men,String woman){ men = men.replace("座",""); woman = woman.replace("座",""); try { men = URLEncoder.encode(men,"UTF-8"); woman = URLEncoder.encode(woman,"UTF-8"); } catch (Exception e) { e.printStackTrace(); } String url = "http://apis.juhe.cn/xzpd/query?men="+men+"&women="+woman+"&key=星座配对接口"; return url; } // 星座运势接口 public static String getLuckURL(String name){ try { name = URLEncoder.encode(name,"UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } String url = "http://web.juhe.cn:8080/constellation/getAll?consName="+name+"&type=year&key=星座运势接口"; return url; } }
报错信息/system/bin/sh: cd: /data/data/com.skydroid.demo: Permission denied解决方案cd到根目录,输入su root回车,这样就获取了root权限。
Graphviz 是一个开源工具,可以运行在Windows系统和Linux系统上。适用于大多数平台的二进制文件可以在 Graphviz 主页上找到。AIX 二进制文件可以在perzl.org 上找到。Graphviz 应用程序中有多种工具可以生成各种类型的图表(dot、neato、circo、twopi 等)。下面开始在Windows系统上安装配置Graphviz(预计耗时3min)1、点击链接下载安装包graphviz-2.38.msi2、双击下载好的msi文件,然后一直选择Next,默认安装在C盘的Program Files(x86)下,详细安装步骤如下所示:3、配置环境变量:计算机→属性→高级系统设置→高级→环境变量→系统变量→path,在path中加入路径:C:\Program Files (x86)\Graphviz2.38\bin4、验证安装:在cmd命令行界面,输入dot -version,然后按回车,如果显示如下图所示的graphviz相关版本信息,则代表安装配置成功!5、如果我们需要在Python中直接将.dot文件转成pdf显示出来,就需要导入库,安装库也很简单,只需要执行pip install graphviz 即可。比如在Python中将决策树的.dot文件显示出来就是with(open("tree.dot")) as f: dot_graph=f.read() dot=graphviz.Source(dot_graph) dot.view()
一、图灵机介绍这里是图灵机的定义,防止有同学忘记了,就再提一下。二、设计思想因为我们是要求做PPT上台演讲的,所以我直接将我的PPT内容选择性地展示出来了。三、转移函数因为我只用了一张纸带,所以,需要用到的状态比较多,一共36个状态,手写了一遍,字迹比较潦草,不过不影响思路。四、程序设计然后核心就是用字典存储上面的状态转移函数,从q0开始,每次读一个就进行转移,最后计算完后,读头还必须要回到初始位置。这样就模拟出读头在纸带上的移动。下面用图片描述一下变化状态,为了节省空间,每个字母就是代表有n个1,比如a就表示这里是a个1,以此类推五、运行结果计算出10000大概要花费30s,两个原因:1、Python编译速度很慢,C++实现起来肯定会快很多 2、单带计算读头移动次数太多,距离太长,可以改为多带实现,会更快。六、实现源码#纸袋初始状态为:@a0x0b0y0000 #输入需要计算的a、x、b、y a=input('请输入a的值:') x=input('请输入x的值:') b=input('请输入b的值:') y=input('请输入y的值:') #开始将空格@和1还有0写上纸带,纸袋假设无限长 list=['@'] for i in range(int(a)): list.append('1') list.append('0') for i in range(int(x)): list.append('1') list.append('0') for i in range(int(b)): list.append('1') list.append('0') for i in range(int(y)): list.append('1') for i in range(4): list.append('0') for i in range(10000): list.append('@') #转移函数,用字典存储 dict={'q0,1':'q1,a,R','q1,1':'q1,1,R','q1,0':'q2,0,R','q2,1':'q3,x,R', 'q3,1':'q3,1,R','q3,0':'q4,0,R','q4,1':'q4,1,R','q4,0':'q5,0,R', 'q5,1':'q5,1,R','q5,0':'q6,0,R','q6,0':'q7,1,R','q7,0':'q7,0,R', 'q7,@':'q8,0,L','q8,1':'q8,1,L','q8,0':'q8,0,L','q8,x':'q2,x,R', 'q6,1':'q6,1,R','q2,0':'q9,0,L','q9,x':'q9,1,L','q9,0':'q9,0,L', 'q9,1':'q9,1,L','q9,a':'q0,a,R','q0,0':'q10,0,R',#a*x已完成 'q10,1':'q11,x,R','q11,1':'q11,1,R','q11,0':'q12,0,R','q12,1':'q12,1,R', 'q12,0':'q13,0,R','q13,1':'q13,1,R','q13,0':'q14,0,R','q14,1':'q15,c,R', 'q15,1':'q15,1,R','q15,0':'q16,0,R','q16,0':'q17,1,R','q17,0':'q17,0,R', 'q17,@':'q18,0,L','q18,0':'q18,0,L','q18,1':'q18,1,L','q18,c':'q14,c,R', 'q16,1':'q16,1,R','q14,0':'q19,0,L','q19,c':'q19,1,L','q19,0':'q19,0,L', 'q19,1':'q19,1,L','q19,x':'q10,x,R','q10,0':'q20,0,R',#a*x*x已完成 'q20,1':'q21,b,R','q21,1':'q21,1,R','q21,0':'q22,0,R','q22,1':'q23,y,R', 'q23,1':'q23,1,R','q23,0':'q24,0,R','q24,1':'q24,1,R','q24,0':'q25,0,R', 'q25,1':'q25,1,R','q25,0':'q26,0,R','q26,0':'q27,1,R','q27,@':'q28,0,L', 'q28,1':'q28,1,L','q28,0':'q28,0,L','q28,y':'q22,y,R','q26,1':'q26,1,R', 'q22,0':'q29,0,L','q29,y':'q29,1,L','q29,0':'q29,0,L','q29,1':'q29,1,L', 'q29,b':'q20,b,R','q20,0':'q30,0,R',#b*y已完成 'q30,1':'q30,1,R','q30,0':'q31,0,R','q31,1':'q31,1,R','q31,0':'q32,0,R', 'q32,1':'q32,1,R','q32,0':'q33,1,R','q33,1':'q33,1,R','q33,0':'q34,0,L', 'q34,1':'q35,0,L','q35,1':'q35,1,L','q35,0':'q35,0,L','q35,b':'q35,1,L', 'q35,x':'q35,1,L','q35,a':'q35,1,L','q35,@':'q36,@,R'#a*x*x+b*y已完成 } state='q0' point=1 while(state!='q36'): #(q0,1) state=state+','+list[point] #1->a list[point]=dict[state].split(',')[1] #L or R direction=dict[state].split(',')[2] if direction=='R': point=point+1 else: point=point-1 #q0->q1 state=dict[state].split(',')[0] count=0 last_index=0 first_index=0 num=0 while(count<6): last_index = last_index + 1 if(list[last_index]=='0'): count=count+1 if(count==5): first_index=last_index num=last_index-first_index-1 print("结果为:",num)只有十分努力,才能看起来毫不费力。
我们在设计layout的时候,使用Split视图,就是左侧是代码,右侧是设计图,但是我们忽视了最上方的工具栏,这里才是真正的宝藏。下面教大家如何调出这个模拟器界面。1、首先是这个蓝色书的图标,默认都是第三个,就是设计和蓝图,但是我们并不想要蓝图,所以,选择设计就好了。2、再选择这个旋转的图标,可以看到默认是Portrait(竖直排列),如果你使用的是平板模拟器,就可以选择Landscape(水平排列),UI Mode就是更换你UI的类型,一般不需要改动,其他不需要创建。3、下面是夜间模式或者白天模式的选择,一般都是Not Night,这个没有什么影响。4、下面是模拟器API的选择,如果勾选了第一个Auto的话,就会自动帮你选择最新的API,主要是为了让所有libs都能够在模拟器上正常使用。5、下面眼睛图标有两个选项,第一个是展示系统UI,也就是会有导航栏、状态栏和标题栏。第二个是工具栏提示。
首先,找到自己需要调整大小的图片,比如下面这张,用照片打开,可以看到是1280x841像素,下面我们把它调整到830x310像素。1、右击图片,使用画图打开,如下所示:2、然后选择最上面的重新调整大小,然后选择像素3、再将保持纵横比这个勾去掉,水平设为830,垂直设为310,然后确定。4、保存图片即可,重新打开图片发现,已经被调整好了。照片可能会被拉伸或者收缩,都是正常现象。
运行模拟器安装app,报错信息如下:翻译一下就是:这个软件不能被安装:安装失败是因为手机存储空间不足。所以,我们需要把模拟器中不需要用的app卸载给它腾出空间,或者再创建一个模拟器。
一、下载CUDA10.0的官网地址,选择好自己所需版本,这里是我推荐的选择,然后点击Download。cudnn官网地址,直接寻找并下载7.4.1.5版本的cudnn。下载完后应该是这两个文件。二、安装1、打开cuda.exe进行安装,可能会出现下面的提示,选择OK即可。2、同意并继续。3、这里我们选择【自定义】,然后下一步。4、这里是安装的驱动程序组件,默认全选,然后下一步。5、直接默认装在C盘,这样可以防止各种出错。6、这里提示没有CUDA的编辑器,不用管它,勾选了然后Next,等待安装。7、可能有些同学会报安装失败,这里不用担心,只是一两个工具没有装上,不影响。安装完成后,解压刚刚下载的第二个文件,即Cudnn的压缩包,然后进入cuda目录,复制这些文件。8、进入C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0中,将刚刚复制的文件粘贴到这里,到此安装完成。9、最终安装成功的目录如下,大家可以对照一下:
在使用pip安装库时,总会出现WARNING的黄色警告,看起来很让人不舒服,这里教大家去除它。(这里以安装rospy库为例,当然rospy库不是这样安装的,我只是做个示例)找到警告信息中报错的目录,然后删掉~开头的文件夹即可。我们再来运行,可以看到这里没有了刚刚的WARNING,这里黄色WARNING只是因为pip版本不是最新而已。
1、创建环境这里的py37是我随意起的环境名,可以自己定,后面的python版本也是可以指定的。比如我这里是创建是python3.7版本,名称为py37的环境。conda create -n py37 python=3.7 回车后会检测即将被安装的工具,可以看到里面有sqlite、vsCode、pip等等。输入y,然后回车进行下载,下载完会提示done,像这样就是下载好了。系统还告诉了我们激活环境和退出环境的命令。简单来说,激活环境其实就是进入文件夹py37,退出环境就是退出文件夹py37,我们来演示一下。conda activate py37 激活环境conda deactivate 退出环境2、删除环境删除某个环境时,一定不能在该环境下删除,一般都是base环境下删除我们创建过的环境。conda remove -n py37 --all 这时候,我们输入y确定,然后刚刚创建的py37就被移除了。但这样删除环境不是很彻底,还会有文件无法删除,导致这个文件夹还在,所以我们到安装anaconda的文件夹下找到envs文件夹,然后删除py37这个文件夹。
1、首先打开Android Studio,Tools—>AVD Manager打开模拟器管理界面。2、选择Create Virtual Device。3、左侧是模拟器的类型(电视、平板、手机等等),这里我们正常选择Phone,中间是手机尺寸。手机尺寸选小了,可能运行有些项目只显示一些。选大了可能运行其他项目只占一小块屏幕。所以,选择合适的尺寸很重要,今天我也是上了一课。以我自己的代码调试经验来看,Pixel2 XL这个机型非常实用,分辨率是1440X2880,基本上就比真机屏幕小点,关键是屏幕密度Density高达560dpi,屏幕大小兼容性很强,补充小知识:dpi/px=density。4、然后Next,这里选择API版本,这也是非常重要的一步,根据你的项目习惯,你习惯新建项目用多大的API,你就选择比它高的。比如我项目API都是21,那我模拟器API版本至少21以上。5、然后Finish就创建好了,当然你也可以给模拟器改名,设置内存大小等。然后就可以将构建好的项目运行到模拟器上了。
1、查看本机的CUDA版本cmd命令行输入nvidia-smi,在第一行最右边可以看到CUDA的版本号,我的版本是11.12、安装Pytroch1、点击进入Pytorch官网然后选择Get Started,就是如下界面2、这里进行Pytorch版本的选择,首先我选择的是Stable稳定版,然后OS是Windows系统,Package包就使用Conda,Language肯定选Python,最后的Compute Platform就根据大家的需求来定了。大家如果想在自己电脑(具有NVIDIA显卡)上跑通代码,就选CUDA,如果不需要在自己电脑上跑(在服务器上跑)或者没有独立显卡,就选CPU。我们在第一步已经看过自己的NAVIDA的CUDA版本了,这里我们一定要选择比自己版本低的CUDA。比如,像我的版本是11.1,那么就只能选择10.2,因为11.3有点高了。同样道理,基本上大家都能选择10.2。如果没有安装anaconda的同学,可以参考我这篇博客:anaconda安装配置教程如果想通过pip安装Pytorch的同学,可以告诉你通过pip安装非常麻烦,几乎无法安装,花费的时间远远多于安装anaconda的时间,所以,这条弯路我先帮大家探测过了,不要再踩啦。3、然后复制最下面那段命令行语句,打开anaconda命令行,先进入自己需要安装Pytorch的环境,然后运行。conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch 4、可以看到将要安装的包里面有Pytorch和cudatoolkit,我们输入y确认,然后回车5、下面就等待这些package安装成功,可以看到Pytorch还是比较大的,所以耐心等待一下。6、安装完成后,会提示信息done。7、输入pip list,查看我们的包是否被安装,这里可以看到torch相关的包都安装了。8、我们输入python进入下Python环境,然后输入import torch,如果没有报错说明可以导入成功。9、输入torch.cuda.is_available()查看torch是否可以使用显卡,True就代表可以!
2022年04月