如何设置u盘启动sss为第一启动

404 Not Found
404 Not Found更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
按住视频可进行拖动
&正在加载...
举报视频:
举报原因(必填):
请说明举报原因(300字以内):
请输入您的反馈
举报理由需要输入300字以内
感谢您的反馈~
请勿重复举报~
请刷新重试~
收藏成功,可进入查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
40启动双喷78sss,冰火土龙全齐
正在检测客户端...
您尚未安装客户端,正在为您下载...安装完成后点击按钮即可下载
30秒后自动关闭
40启动双喷78sss,冰火土龙全齐">40启动双喷78sss,冰火土龙全齐
请选择打赏金额:
热门短视频推荐
Copyright (C) 2018 & All Rights Reserved
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
正在为您下载爱奇艺客户端安装后即可快速下载海量视频
正在为您下载爱奇艺客户端安装后即可免费观看1080P视频
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
后才可以领取积分哦~
每观看视频30分钟
+{{data.viewScore}}分
{{data.viewCount}}/3
{{if data.viewCount && data.viewCount != "0" && data.viewCount != "1" && data.viewCount != "2" }}
访问泡泡首页
+{{data.rewardScore}}分
{{if data.rewardCount && data.rewardCount != 0 && data.getRewardDayCount != 0}}1{{else}}0{{/if}}/1
{{if data.rewardCount && data.rewardCount != 0 && data.getRewardDayCount != 0}}
+{{data.signScore}}分
{{data.signCount}}/1
{{if data.signCount && data.signCount != 0}}
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制各位大佬雪地sss都是怎么刷的呀,250碎片感觉遥遥无期。。话说那个五米大概是多远老婆镇楼【崩坏3rd吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,057,556贴子:
各位大佬雪地sss都是怎么刷的
各位大佬雪地sss都是怎么刷的呀,250碎片感觉遥遥无期。。话说那个五米大概是多远老婆镇楼
游戏账号交易,账号出售,买号,卖号,「交易猫」担保交易,寄售交易,安全可靠!7*24小时专业客服服务!
纯手刷才是爱
有钱抽扩充
也可以手刷碎片
抽次元扩充呀~肯定都是雪地。
点亮12星座印记,
是200,以前有外传必掉容易些
左边是你 右边是你老婆?
五米就40米長刀的1/8
抽吧,这期雪帝up
别把,两个大法粉怕是要把你吊起来打
神的左右护法
四个月够了
点亮12星座印记,
看到这期扩充了吗…… 氪下去分分钟ss
五米3个琪亚娜的长度
不愿意氪也不愿意肝,策划也很为难啊
贴吧热议榜
使用签名档&&
保存至快速回贴我是gjssss_天涯社区
给我是gjssss发短消息:
最近玩过的游戏https://blog.csdn.net/
https://static-blog.csdn.net/images/logo.gif
这个人很懒,什么都没留下
https://blog.csdn.net/m0_
https://blog.csdn.net/
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
兜兜转转,人生中的第一份工作又是和C打交道,虽说是Linux下C,不在是单片机上的C语言了。。。
回顾过往,最开始接触的就是单片机,当时c和汇编用的很顺手,感觉特舒服,后来接触32位单片机,那时候直接用的别人写好的库,没去仔细研究,打那以后,感觉自己像在田野里玩耍的孩子,遍地野花,各种新鲜东西充斥我的视野,什么都想去了解,去尝试,磕磕绊绊自己摸索着想干点什么,但到头来发现,接触的很多,真正特别深入的没有,感觉挺长时间没沉下心来,安静的写程序了。。
一般那些特别成功的人做出一个成果需要十年时间,我要静心,抛去那些表面浮华的,专心先把基础做好
感觉好久没用C了啊,感觉忘得差不多了,回忆一下吧
变量(有/无符号(char int short long float double))
运算符(算数、逻辑、位、三目)
流程控制(顺序 分支 循环)
流程控制关键字(goto break continue)
预编译命令(宏定义 文件包含 条件编译)
嗯,上面就是我想了一会能想到的东西了,然后找找有什么错的和忘的地方。。。参照c语言程序设计第2版。。。
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
以下是网上整理的,转侵删。。
坐标杭州,,,
一周时间(就是不要太仓促)
看小区与公司路程,半小时内
房东年纪大一点
发布时间两天内
多预备几处备选
预定接受房租范围,就算多100,也是100x12=1200。。。
看房注意几点
①表现得素质高一点,首次见面会让业主觉得你这个人靠谱,愿意把房子租给你,到时真要租的话,价格也好谈;
②即使这个房子性价比高得可怕,也不要表现得太中意房子,但是也别刻意挑刺,认真地看一圈然后礼貌地向业主表示感谢,告诉他你要再看两家才能定下来,或者要回去考虑一下再给业主答复。这么做同样是为了将来议价做好准备
③尽量向业主展示你工作稳定的一面,这样能争取到更加好的付款方式:季付甚至是月付
④和业主聊点房子以外的事,多少能知道房东的做事风格和性格等等,毕竟租房子不是一锤子买卖,以后搞不好就会出纠纷,而且因为没有中介这个中间人调解,出了纠纷会很麻烦。
一楼、顶楼及地下室还有窗户朝北的房间,能不租尽量不要租。最好最好租朝南的房子(冬天冷)
小区相对安静点也适宜居住,周围菜场超市购物饮食健身等配套设施也齐全。房内硬件配置:空调,冰箱,洗衣机,热水器这基本的几样要齐全。家电少的房子便宜,家电自己买(长期租更划算。。)
学会观察。空调好不好用,马桶有没有堵住,洗衣机是不是外强中干?热水器能不能正常运行?网速够不够快?
合租 合租者性别年龄等等
房产证身份证是否一致
房产证写明地址面积编号
隔天签约(留一晚上好好想想)
合同身份证信息和房产证核对
水电网费怎么算 初始值(水 4元/吨,如果是合租的话,水费通常按人头收费(10元/月) ;电 1元/度 网费可以和房东商量算在房租里,不用另交。)
确认设备新旧有无损坏:墙面上有任何污损、涂 鸦、裂痕、墙皮脱落;家具、灶台、其他设施上的任何裂痕、损坏、污损;地板上的任何污损、损坏、裂痕、包括木地板的翘损等等;任何地方掉了一块瓷砖、或者 瓷砖上有裂痕、污渍;其他诸如桌子腿不牢靠、衣柜门不好使、电器失灵等等。
合同时间 中间不租了押金问题
刚实习or刚毕业的尽量不要签1年合同,签半年比较好,可能会换工作,转租一般比找房子还麻烦,毕业1年左右可以开始长住
房东签字退换押金条件
双方通讯地址银行账号
转租约定(可以转租)
续租约定(租期到后优先租)
仔细看租赁合同内容!!!
靠谱的找房的地方
19楼 闲鱼 豆瓣
识别中介的方法(主要针对网站信息):
所提供的电话号码,在百度上查一下,发布了N条房源的必是中介
在同一个租房网站发布了N条不同房源信息的必是中介
自称“XX地区多套房源/各种价位”,必是中介
租房信息写得过于有条理、过于详细、过于专业的一般都是中介——想想看,你要是自己当房东写得出那么专业的信息么……
房源照片与房屋叙述不符的必是中介——比如,房子写的是1居室,但是照片明显是3居室
常用名词解释
1) 整租:你把一整套房子都租下来
2) 合租:你只是租N居室中的一居,其他房间住着其他人
3) 主卧/次卧:一般对于两居或三居的房间,大的那一间卧室称为主卧(也就是一般三口之家住的话老爸老妈住的),小的那一间卧室称为次卧。也就是说,出现这4个字的房源一般是合租的
4) 正规单间:指非隔断的房间——也是间接告诉你这个房子是合租房。如果是正规的独立一居室,一般称为“正规一居”或者“独立一居”
5) 大开间:没有单独的客厅,客厅和卧室融为一体的一种一居室户型。简单说就是一间大房间+卫生间+厨房(可能还有阳台),这种户型一个人住的话其实正好
6) 押N付M:指付房租和押金的方式,比如押1付3=交1个月房租作为押金,每3个月交一次房租(3个月的),也就是说你第一次需要叫4个月房租(不算中介费)。
7) 南北通透:指房屋开窗的朝向为南北,并且南北两边都有窗户,可以通风,这样的房子是朝向最好的。最不好的是卧室窗朝东,因为早上太阳会直射着你把你惊醒,而下午的时候屋里光线又会很暗。
8) 塔楼/板楼/砖楼:砖楼好于板楼好于塔楼。砖楼是最老的那种用砖砌的房子,是透气性等等最舒适的房子,不过现在基本已经很少了。板楼是用预制板盖的楼,优 点是成本低、建造效率高,所以现在被广泛采用,比起砖楼要差一点。塔楼一般是圆柱形的楼,属于面积利用效率最高的楼,对于开发商来说,同样的土地面积,盖 塔楼可以比板楼多弄出很多面积来,所以利润高;塔楼的缺点是形状、朝向会比较怪异,有的墙是圆的或者斜的,有的房间甚至会没有窗户,优点是卖价会便宜一 些。
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
bios/uefi-&mbr-&bootloader-&kernel
其中bios和uefi是位于主板上的固件,它将是开机后第一个启动的程序,当其启动时,将会去分析计算机里面有哪些储存设备,BIOS会依据使用者的设定去取得能够开机的硬盘, 并且到该硬盘里面去读取第一个扇区的 MBR 位置,从而取得开机管理程序.
u盘方式安装系统时会先进bios把u盘启动改为最高优先级,重启后就能进u盘里刻录好的系统安装程序了
像linux的grub就是一种bootloader,bootloader的功能有:
转交控制权给其他 loader
bootloader可安装的地方有两个,主引导扇区或者分区的引导扇区,这也是多操作系统引导的基础
bootloader加载完内核,他的任务就完成了,后面就是内核的工作了.能让计算机硬件正确无误的运作的就算内核了….
kernel基本组成
1.内存管理
2.任务调度
3.硬件驱动
4.文件系统
login shell启动流程
有一个框里有三个文件,先找到那个读哪个,应该是兼容问题吧..
/etc/profile
login shell 才会读
~/.bash_profile那三个之一
login shell 才会读
non-login shell 会读
一些有用的文件
/etc/issue, /etc/motd
bash 的进站与欢迎讯息
/etc/man_db.conf
man page搜索的路径
~/.bash_history
~/.bash_logout
注销shell执行
/etc/modules-load.d/*.conf
想要内核加载的模块
/etc/modprobe.d/*.conf
模块参数配置
/lib/modules/version/kernel 或 /lib/modules/$(uname -r)/kernel
模块位置 注
/lib/modules/$(uname -r)/modules.dep
记录加载模块间依赖性;depmod可更新此文件
etc/default/grub
grub环境配置文件
/etc/grub.d
结合grub配置文件产生/boot/grub/grub.cfg
/boot/grub/grub.cfg
真正的grub配置文件
注:模块(驱动)的文件后缀名一般为.ko(kernel object)
系统守护进程与服务
服务(service):常驻在内存中的程序,且可以提供一些系统或网络功能
守护进程(daemon):完成服务的程序??
这两个不必仔细区分(真的吗。。感觉好像不是一个东东。。)
据说System V的机制被废弃了,但还是有一部分init脚本处理方式被留下来了,位置在/etc/init.d下:
这些服务的操作(daemon代表脚本名字):
启动:/etc/init.d/daemon start
关闭:/etc/init.d/daemon stop
重新启动:/etc/init.d/daemon restart
状态观察:/etc/init.d/daemon status
就拿cron的其中一段来看:
case "$1" in
log_daemon_msg "Starting periodic command scheduler" "cron"
start_daemon -p $PIDFILE $DAEMON $EXTRA_OPTS
log_end_msg $?
log_daemon_msg "Stopping periodic command scheduler" "cron"
killproc -p $PIDFILE $DAEMON
[ $RETVAL -eq 0 ] && [ -e "$PIDFILE" ] && rm -f $PIDFILE
log_end_msg $RETVAL
restart) log_daemon_msg "Restarting periodic command scheduler" "cron"
reload|force-reload) log_daemon_msg "Reloading configuration files for periodic command scheduler" "cron"
log_end_msg 0
status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $?
log_action_msg "Usage: /etc/init.d/cron {start|stop|status|restart|reload|force-reload}"
可见这个脚本可跟的参数有start,stop,restart,reload,force-reload,status这几个。。
还有一个runlevel的东西。。,一共分了7个执行等级,比如第五个执行等级就是文字加图形界面,而这个等级默认启动的脚本在/etc/rc5.d下:
可以看到都是软连接。。
而原先可以init 3/5切换文字/图形界面,现在虽然也可以,但实际执行的是systemd了
lrwxrwxrwx 1 root root 20 5月
16 23:21 /sbin/init -& /lib/systemd/systemd
而现今通过init启动脚本来开机的方式已经被废弃不用了,改用 systemd (system daemon)这个启动服务管理机制,systemd仅通过systemctl就可以完成所有控制~。systemd将过去的daemon执行脚本都称为unit,并将unit进行了分类,主要类型如下:
service:文件后缀为.service,用于定义系统服务;
socket:文件后缀为.socket,用于标识进程间通信使用的socket文件;
target:文件后缀.target,用于模拟实现“运行级别”;
snapshot:文件后缀.snapshot,用于管理系统快照;
device:文件后缀.device,用于定义内核识别的设备;
mount:文件后缀.mount,用于定义文件系统挂载点;
automount:文件后缀.automount,用于定义文件系统的自动挂载点;
swap:文件后缀.swap,用于标识swap设备;
timer:文件后缀.timer,用于管理计划任务;
path:文件后缀.path,用于根据文件系统上特定对象的变化来启动其他服务;
slice:文件后缀.slice,用于资源管理;
scope:文件后缀.scope,用于外部创建的进程;
unit主要保存在:
1、/lib/systemd/systemd
2、/run/systemd/system
3、/etc/systemd/system
还有就是有一个target的概念,它就相当于systemV 的 init 的 runlevel,执行某个 target 就是执行好多个daemon脚本。。。
比如去文字界面:
systemctl isolate multi-user.target
返回图形界面:
systemctl isolate graphical.target
日志文件系统
日志就是用来记录系统产生的各种消息的,而完成日志信息记录到日志文件靠的是rsyslog.service,就是靠这个服务各种日志信息得以记录。。一般来说日志都会在/var/log下,但不同发行版关于日志文件命名可能不同,可以查看rsyslogd 这个 daemon的配置文件,位于/etc/rsyslog.conf,如下:
$IncludeConfig /etc/rsyslog.d/*.conf
好吧,接着找:
Default rules for rsyslog.
For more information see rsyslog.conf(5) and /etc/rsyslog.conf
# First some standard log files.
Log by facility.
auth,authpriv.*
/var/log/auth.log
*.*;auth,authpriv.none
-/var/log/syslog
/var/log/cron.log
-/var/log/daemon.log
-/var/log/kern.log
-/var/log/lpr.log
-/var/log/mail.log
-/var/log/user.log
# Logging for the mail system.
Split it up so that
# it is easy to write scripts to parse these files.
#mail.info
-/var/log/mail.info
#mail.warn
-/var/log/mail.warn
/var/log/mail.err
# Some "catch-all" log files.
auth,authpriv.\
news.mail.none -/var/log/debug
#*.=*.=*.=\
auth,authpriv.\
cron,daemon.\
mail,news.none
-/var/log/messages
# Emergencies are sent to everybody logged in.
:omusrmsg:*
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#daemon,mail.*;\
news.=news.=news.=\
*.=*.=warn
由此,各种日志的存放位置就清楚了
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
command --help
–help参数一般都有…查看这个命令的帮助
在线参考手册
超链接式帮助文档
/usr/share/doc
说明文件存放
改文件所有者和组
改变隐藏文件属性
显示文件隐藏属性
文件与目录操作
列出目录内容
建立一个空文件
取得文件名
取得目录名
显示当前目录
建立一个新的目录
删除一个空的目录 参数:-p:连同上层空的目录也一起删除
查看文件类型
正着输出文件内容
倒着输出文件内容
加行号显示
分页显示,不可前翻
分页显示,可前翻
只显示头几行(默认10)
只显示尾几行(默认10)
二进制方式读取文件内容
磁盘、文件系统管理
建立链接 参数:-s建立软连接 被链接目录/文件的路径必须为绝对路径
改变根目录
列出文件系统的整体磁盘使用量
备份与刻录文件 iso镜像文件制作与刻录!
挂载文件系统 参数:恢复模式时可用mount -o remount,rw,auto /
格式化为ext4文件系统
mbr分区表分区
gpt分区表分区
列出磁盘的分区表类型与分区信息,mbr表分区和gpt分区表的分区
文件与命令查找
命令脚本文件等查找,从$PATH查找
查找文件,从特定目录
从数据库查找 updatedb可更新数据库
从硬盘查找文件
shell内建指令,查看命令路径
查看或设定终端按键意义
设定终端输入输出环境 跟上面的set是同一个
将命令放到后台执行
将运行的任务挂起到后台
bg %jobnum
将指定jobnum的挂起任务在后台继续执行
fg %jobnum
将挂起的jobnum任务恢复到前台
查询后台的任务
kill [-kill] %jobnum
杀死jobnum任务,不加%会直接杀死pid为jobnum的进程!
一次性定时任务
系统空闲时执行,一次性
周期性定时任务
脱机执行任务
获取进程快照 参数:-l仅列出与当前bash相关进程 aux列出系统所有进程
动态进程信息
发送信号给线程,不止杀线程而已。。
通过下达指令名称来发信号
一些的信息获取
查看内存使用
查看系统与内核信息
观察系统启动时间与工作负载
查看各种网络状态
内核产生的信息
查看虚拟存储各种信息,cpu、硬盘、、、
查询占用文件文件夹文件系统的进程 umount不掉的时候可用
列出被进程开启的文件
找出某个正在执行的程序的PID
查看CPU 型号、主板型号与内存相关的型号等等
列出整个PC系统的 PCI 接口装置
列出目前系统上面各个 USB 端口口的状态,与连接的 USB 装置
产生/更新模块以来文件
显示内核所加载模块的状态
查看模块信息
直接加载模块
直接移除模块
查询/加载/移除模块(可解决依赖性问题)
显示日期与时间
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
#自定义音效for zsh
pactl list|grep '^.*:bell.ogg$' && /dev/null&&pactl remove-sample bell.ogg
pactl remove-sample bell-window-system
pactl upload-sample /additional/sounds/cat.ogg bell-window-system
把zsh的警告音换成猫咪叫声了…把bash的换成了心跳声..其他格式我没试过,我直接转了ogg,随便放在设么位置,把上面的路径换掉,然后加到.bashrc或.zshrc里就可以了…虽然这样还是笨办法,但不想去再研究了。。。
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
重定向与管道是两个神奇的东西..我现在还没搞懂他们..慢慢来
下面是三种是我最早见到的,然后,我又见到了一些理解不能的语句,后来又发现其他形式的重定向…晕乎乎
代码为 0 ,使用&或&&
代码为 1 ,使用 &与1&或 &&
标准错误输出
代码为 2 ,使用 2&或 2&&
&与1&相同,&代表了默认是重定向标准输出
1&: 以覆盖的方法将『正确的数据』输出到指定的文件或装置上;
1&&: 以累加的方法将『正确的数据』输出到指定的文件或装置上;
2&: 以覆盖的方法将『错误的数据』输出到指定的文件或装置上;
2&&: 以累加的方法将『错误的数据』输出到指定的文件或装置上;
总之两个代表追加..
/home -name .bashrc & list_right 2& list_error
将会将find执行结果保存,其中标准输出保存到list_right,错误输出保存到list_error,这两个文件:
若不存在则创建
若存在则覆盖
摘自百度知道:
linux重定向中&&和&&是一个意思,是“复制一个文件描述符”的意思。
标准输入(stdin) 代码为 0 ,实际映射关系:/dev/stdin -& /proc/self/fd/0
标准输出(stdout)代码为 1 , 实际映射关系:/dev/stdout -& /proc/self/fd/1
标准错误输出(stderr)代码为 2 ,实际映射关系: /dev/stderr -&/pro/self/fd/2
原先有一句关于管道和重定向区别的话,是说重定向的作用对象只能是文件(这里我想吐槽一下,不是说linux一切皆文件吗..),看到上面说的映射关系,我大概能了解一点了,现在学习的主要问题就是不了解底层,只知道表面肯定会晕..就像for循环,c里面说for(expr1;expr2;expr3)这里第一个填初始化式子,第二个填控制条件,第三个控制循环,但我如果说,第一个就是开始时运行,第二个为真继续循环,第三个每次都会执行,那么我写程序的选择就很多了…
然后,接着说:
& 和 & 分别代表重定向的方向,是从左到右还是从右到左
&&和&&代表追加,也就是不改变重定向目标文件原有的内容,追加在后面
&&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出;
&&n 标准输入复制自文件描述符 n;
上述dup(2)我猜是这个:
man -f dup
- duplicate a file descriptor
2代表种类:系统核心可呼叫的函数与工具等
实验时间..
目录下有一脚本link.sh,不存在unknow.sh
运行命令(-是我手动添加的,代表一次执行及输出,注释也是后加的):
link.sh unknow.sh && test
ls: 无法访问'unknow.sh': 没有那个文件或目录
-rwxr-xr-x 1 sss sss 153 5月
20 15:57 link.sh
link.sh unknow.sh && test
ls: 无法访问'unknow.sh': 没有那个文件或目录
-rwxr-xr-x 1 sss sss 153 5月
20 15:57 link.sh
----------
link.sh unknow.sh
ls: 无法访问'unknow.sh': 没有那个文件或目录
-rwxr-xr-x 1 sss sss 153 5月
20 15:57 link.sh
link.sh unknow.sh
-rwxr-xr-x 1 sss sss 153 5月
20 15:57 link.sh
ls: 无法访问'unknow.sh'ls: 无法访问'unknow.sh': 没有那个文件或目录
: 没有那个文件或目录
----------
link.sh unknow.sh
ls: 无法访问'unknow.sh': 没有那个文件或目录
-rwxr-xr-x 1 sss sss 153 5月
20 15:57 link.sh
link.sh unknow.sh
-rwxr-xr-x 1 sss sss 153 5月
20 15:57 link.sh
ls: 无法访问'unknow.sh'ls: 无法访问'unknow.sh': 没有那个文件或目录
: 没有那个文件或目录
----------
echo ""&test
link.sh unknow.sh
ls: 无法访问'unknow.sh': 没有那个文件或目录
-rwxr-xr-x 1 sss sss 153 5月
20 15:57 link.sh
-rw-r--r-- 1 sss sss
20 20:10 test
link.sh unknow.sh
ls: 无法访问'unknow.sh': 没有那个文件或目录
-rwxr-xr-x 1 sss sss 153 5月
20 15:57 link.sh
-rw-r--r-- 1 sss sss 114 5月
20 19:59 test
----------
link.sh unknow.sh
link.sh unknow.sh
----------
link.sh unknow.sh
ls: 无法访问'unknow.sh': 没有那个文件或目录
ls: 无法访问'test': 没有那个文件或目录
-rwxr-xr-x 1 sss sss 153 5月
20 15:57 link.sh
link.sh unknow.sh
ls: 无法访问'unknow.sh': 没有那个文件或目录
ls: 无法访问'test': 没有那个文件或目录
-rwxr-xr-x 1 sss sss 153 5月
20 15:57 link.sh
搞个表格,空行代表与上方相邻不为空的相同
输出重定向:
重定向标准输出和错误输出
重定向了标准错误输出,但是有问题,会出现重复两次的现象,这个还没搞懂
到标准输出
到标准错误输出
将标准输出转成标准错误输出
将标准错误输出转成标准输出
按照前面说的
&&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出;
我觉得输出重定位应该这样理解,&&和&&是相同的,但代表标准输出的1和代表标准错误输出的2只应该在其左边,也就是开口方向,不然就不算重定向了.
好烦…以后就只需要记住全部重定向输出用&&或&&好了,少打一个字..
可以直接记&&好了,形式比较一致
标准输出重定向
标准错误输出重定向
标准输出与标准错误输出全部重定向
标准错误输出
将标准输出转成标准错误输出
将标准错误输出转成标准输出
追加标准输出重定向
追加标准错误输出重定向
追加标准输出与标准错误输出全部重定向
另外,不能同时用&和2&同时输出到同一文件,会乱码的…
至于输入,这句没搞懂啥意思
&&n 标准输入复制自文件描述符 n;
然后还有这个,也看不懂,以后再说吧…:
n&&- 表示将 n 号输入关闭
&&-表示关闭标准输入(键盘)
n&&-表示将 n 号输出关闭
&&- 表示将标准输出关闭
下面是式子:
cat & testfile
man cat得:
cat - concatenate files and print on the standard output
cat是将文件输出到屏幕,而当未指定文件时:
With no FILE, or when FILE is -, read standard input
它会去读标准输入,也就是键盘输入
那么上面的就是将键盘输入的打印到屏幕,但因为后面接了重定向,于是输入的内容会跑到文件里去.
cat & catfile & ~/.bashrc
上面说了当cat参数未指定,那么会去读标准输入,这时候~/.bashrc就会变为标准输入了,结果catfile里存的是 ~/.bashrc的内容.执行顺序,cat等待标准输入,catfile等待重定向的标准输出,这时候.bashrc作为标准输入进入,然后cat拿到给了输出,重定向到了catfile,好绕…
cat & catfile && "eof"
右边&&”eof”代表不改变源文件内容,追加eof,这个我只能猜一猜了..
前面是一样的,后面代表最后输入的一定是eof,所以输了eof就能直接结束了,换其他字符也一样
前面说了重定向,这里要说管道符了,我对这两个比较模糊,,,
比如下面这个命令:
echo "./"|ls
可以列出当前目录内容,管道符具有以下特点:
管线命令仅会处理 standard output,对于 standard error output 会予以忽略
管线命令必须要能够接受来自前一个指令的数据成为 standard input 继续处理才行
这下就知道前面2&&1可以干啥了吧,可以让错误信息强制被管道符所用
管道符和重定向有什么区别?
看下面两个命令,其输出是一样的
cat & link.sh
cat link.sh|cat
结合一下这两句话:
&&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出;
&&n 标准输入复制自文件描述符 n;
额,大概就是这样吧,所以说输入输出重定向就是取代了键盘屏幕,能够接受键盘输入的都可以用重定向改为文件输入,能够输出到屏幕的,都可以通过重定向保存到文件.
而管道符可以把标准输出转标准输入,以让可以接受标准输入的命令可以以此为输入执行命令,所以说,重定向也可以做到同样的事情,但一般来说不会这么做,就像cat,默认以文件名为参数,没有文件名才从标准输入读,,,,
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
先简单写一点,以后在整理
记性不好,看完就忘…
sh bash脚本编程调试
当我们写c或其他程序时,都有调试这一技能,调试可以说是很重要的了..能节约你的时间,shell脚本也有调试..
两种方式–执行时添加参数 脚本里添加参数
不执行脚本,仅检查是否有语法错误
执行脚本前,把脚本内容输出到屏幕
将执行时的内容输出到屏幕
执行时添加
假如现在要执行的脚本叫做test.sh,那么
bash -n test.sh可以检查脚本语法是否有错,无错误没有任何输出,echo $?可以得0.同理,其他的参数也一样.
另外这些参数可以组合使用–但是,当加入n后,脚本就不会执行了,所以-nx的x将不会起作用…
脚本里添加
脚本第一行一般都是
#!/bin/bash
这种指定哪个解释器执行脚本的语句,这样,参数可以跟在后面:
这样就可以检查语法错误了
另外还可以针对某一段执行,如:
#!/bin/bash
这样就可以只针对段2检查语法错误,-n开始,+n停止,另外的x,v也是一样
今天看脚本把&& ||和c里面的逻辑运算符混了…
cmd1&&cmd2
cmd1执行成功(返回0),cmd2才执行
cmd1||cmd2
cmd1执行成功(返回0),cmd2不执行
这里说的返回0,是一个环境变量$?,总之不能跟逻辑与或混了…
从键盘读取变量值
声明变量类型
查看变量内容
unset $var
取消设定变量
查看所有变量
export var
将自定义变量变为环境变量,也就是子程序可以调用此变量了 注1
注1:source或.执行脚本即当前shell执行,不是在子程序里执行,可以做到立即生效的作用
比较有用的几个环境变量:
代表用户的家目录
目前正在使用的shell
可执行文件搜索路径
随机数变量
提示字符的设定
本shell 的 PID
上个执行指令的回传值
OSTYPE, HOSTTYPE, MACHTYPE
操作系统、主机、机器类型
关于变量内容的操作
${vat#str}
从变量首开始删除,找最短符合删除
${vat##str}
从变量首开始删除,找最长符合删除
${vat%str}
从变量尾开始删除,找最短符合删除
${vat%%str}
从变量尾开始删除,找最长符合删除
${var/oldstr/newstr}
找到的第一个被替换
${var//oldstr/newstr}
找到的全部被替换
var=${str-expr}
变量未定义赋值,否则将str赋给var
var=${str:-expr}
变量未定义或为空赋值,否则将str赋给var
var=${str+expr}
变量若定义则赋值,否则将str赋给var
var=${str:+expr}
变量非空赋值,否则将str赋给var
var=${str=expr}
若变量str未定义,设定变量str,将值赋给str和var,否则将str赋给var
var=${str:=expr}
变量未定义或为空,将值赋给str和var,否则将str赋给var
var=${str?expr}
变量不存在报错,否则将str赋给var
var=${str:?expr}
变量不存在或为空报错,否则将str赋给var
一些有用的管道命令
使用某种格式从文件中截取每一行中的某一字段
利用正则表达式分析一行数据
根据制定格式对行排序
统计相关字、行、字符数
双向重导向,可以重定向输出到文件的同时依旧输出到屏幕
tab替换为空格
归并两个文件中相同的部分
将两个文件贴在一起,以tab分隔
流编辑,可直接编辑文件;添加多行时要以\分隔;替换: sed 's/要被取代的字符串/新的字符串/g'多用于以行为单位的处理
格式化打印
比较文件差异
对比文件(以字节为单位)
根据diff修订文件
显示时加入标题页码
awk 的指令间隔:所有 awk 的动作,亦即在 {} 内的动作,如果有需要多个指令辅助时,可利用分号;间隔, 或者直接以 [Enter]
按键来隔开每个指令
逻辑运算当中,如果出现是否等于的情况,则务必使用两个等号==
格式化输出时,在 printf 的格式设定当中,务必加上 \n ,才能进行分行!
与 bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号。
test命令 与判断符号 [
注意:判断符号里面都要有两个空格分隔如[空格-e filename空格]
判断符有以下特点:
在中括号 [] 内的每个组件都需要有空格键来分隔;
在中括号内的变量,最好都以双引号括号起来;
在中括号内的常量,最好都以单或双引号括号起来;
if[ expr1];then
elseif[expr2];then
elseif[exprn];then
case $var in
变量内容1)
变量内容2)
最后的*)相当于switch里的default
while [ condition ]
until [ condition ]
for var in con1 con2 con3 ...
for (( 初始值; 限制值; 执行步阶 ))
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
卸载了个python3竟然把我的16.04搞坏了,好像是删除了不该删的东西,囧..
sudo apt-get install ubuntu-minimal ubuntu-standard ubuntu-desktop
据说安回去就好了,我当时正好当时分区分的不满意了,加之官网一看18.04,然后就准备安18.04了..后来把/opt
/usr/local /home /boot 这几个区分出来了
安完18.04,发现控制台按alt加鼠标左键不能拖动了..后来知道是快捷键被改了..变成win了…
更改的话可以参照这个
虚拟终端tty
关于虚拟终端,默认的tty好像是tty1了,然后tty刚开始打不开,参照
改了nomodest,进去后发现正确用户名密码登不进,后来发现要先按一下num lock才行…本来是亮的,按完还是亮的,然后就正常了..我也不知道为什么…
还有就是等进去后不管logout还是exit都会出问题…不知道为啥..
输入法键盘消失
18.04可以换主题了,安装这个
snap://communitheme/
然后登录界面的齿轮图标就能换了,然而我正换着开心呢,突然发现右上的输入法键盘没了,搜狗不能用了..然而我很淡定,突然出问题太正常了..
而且有一个特点,手动启动fcitx就可以,然后我加了开机启动,还是不行,终端运行了下fcitx,发现报错好像是ibus之类的早就开了,然后
ps -ef|grep ibus
发现ibus守护之类的确实有..
然后我又按网上方法重装fcitx还是不行..于是卸载ibus
然后把进程杀了卸载ibus*,重启就好了,我猜应该是只要卸载ibus就正常了吧..
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
阅读:944 评论:1
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
\ 转义,将特殊符号特殊意义去除
用于shell中的通配符
0个到无穷多个任意字符
一个必定存在的任意字符
一定有括号内的其中一个字符存在
内有-表示在编码顺序内的所有字符,如所有小写 大写 大小写 数字: [a-z] [A-Z] [a-zA-Z] [0-9]
相当于去取反 如除小写字母的任意字符:[^a-z],除Z外任意字符:[^Z]
其他特殊符号
批注符号,这个最常被使用在 script 当中,视为说明!在后的数据均不执行
跳脱符号,将特殊字符或通配符还原成一般字符
管线 (pipe),分隔两个管线命令的界定
连续指令下达分隔符,连续性命令的界定
用户的家目录
取用变数前导符,亦即是变量之前需要加的变量取代值
工作控制 (job control),将指令变成背景下工作
逻辑运算意义上的『非』 not 的意思!
目录符号,路径分隔的符号
数据流重导向:输出导向,分别是取代与累加
数据流重导向:输入导向
单引号,不具有变量置换的功能 ($ 变为纯文本)
具有变量置换的功能! ($ 可保留相关功能)
两个` 中间为可以先执行的指令,亦可使用 $( )
在中间为子 shell 的起始与结束
在中间为命令区块的组合!
正则表达式(基础)
一定存在一任意字符
注意不要与通配符混淆
重复此符号前的字符0次到无穷多次
注意不要与通配符混淆
同shell通配符
同shell通配符
同shell通配符
\ {n,m\ }连续 n 到 m 个的前一个 重复字符;
若为 {n} 则是连续 n 个的前一个 重复字符;
若是 {n,} 则是连续 n 个以上的前一个重复字符;
相当于可指定重复次数的*
1个以上的前面重复字符
0个或1个前面的重复字符
用or方式找出字符串,如’dog|cat’代表找出dog 或 cat
[]升级版,找出群组字符串,代表一定存在其中某串字符串,如’1(dog|cat)1’代表1dog1或1cat1
一个以上群组重复,如’A(xyz)+C’可以是AXYZC或AXYZXYZXYZC等等.
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
"启动时隐去援助提示
set shortmess=atI
"不需要备份
set nobackup
"没有保存或文件只读时弹出确认
set confirm
"set mouse=a
set tabstop=4
"tab键缩进距离
set shiftwidth=4
"自动缩进距离
set expandtab
"tab变为空格
set smarttab
"行首为tab,否则为空格
"文件自动检测外部更改
set autoread
"c文件自动缩进
set cindent
set autoindent
set smartindent
"高亮查找匹配
set hlsearch
set background=dark
set showmatch
"高亮匹配括号
"显示标尺,就是在右下角显示光标位置
"去除vi的一致性
set nocompatible
set foldenable
"""""""""""""""""设置折叠"""""""""""""""""""""
"根据语法折叠
set fdm=syntax
"set fdm=manual
"设置键盘映射,通过空格设置折叠
nnoremap &space& @=((foldclosed(line('.')&0)?'zc':'zo'))&CR&
""""""""""""""""""""""""""""""""""""""""""""""
set novisualbell
"启动显示状态行
set laststatus=2
"浅色显示当前行
autocmd InsertLeave * se nocul "离开时恢复
"用浅色高亮当前行
autocmd InsertEnter * se cul
"进入时高亮
"显示输入的命令
set showcmd
"被分割窗口之间显示空白
"set fillchars=vert:/
"set fillchars=stl:/
"set fillchars=stlnc:/
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
Ctrl + Alt + (F1)(F2)(F3)(F4)(F5)(F6): 选择不同的虚拟终端
Ctrl + Alt + F7: 切换到当前登录会话
Ctrl + Alt + L: 锁屏
web时按 “/” 键:查找功能
当前目录下快速文件(夹)定位, 直接输入文件(夹)名字
Alt + F1: 打开主菜单
Alt + F2: 打开运行应用的对话框
Alt + F4: 关闭当前窗口(Ctrl+Q)
Alt + F7: 计划移动窗体选项,你可以使用键盘上的方向键来移动窗口(注: 在窗口最大化的状态下无效)
Alt + F8: 使用键盘上的方向键来更改当前窗口大小(注: 在窗口最大化的状态下无效)
Alt + 左键单击:移动窗口
Alt + 右键 弹出窗口管理器菜单
Alt + 中击:调整窗口大小
Ctrl + Alt + 0:最小化窗口
Ctrl + Super + Up Arrow:最大化
Ctrl + Super + Down Arrow:恢复窗口、最小化
Ctrl + super + D 显示桌面(隐藏所有正常窗口)
Super(轻触点击) 打开dash主页
Super + A 打开dash应用栏目
Super + F 打开dash文件栏目
Super + M 打开dash音乐栏目
Super + C 打开dash图片栏目
Super + V 打开dash视频栏目
Ctrl + Tab 在栏目或者标签间切换
Print Screen获取屏幕截图。
Alt + Print Screen获取窗口的截图。
Shift + Print Screen:获取屏幕上某个区域的截图。光标变为十字。点击并拖动选择区域。
Super + S:激活工作区切换器。缩小所有工作区。
Super + W:激活“Expo”模式。显示当前工作区的所有窗口。
Ctrl + Alt + 方向键: 移到工作空间
Ctrl + Alt + Shift + 方向键: 移动当前窗口到另外的工作空间
nautilus(相当于windows的资源管理器)
Ctrl + W: 关闭当前 Nautilus 窗口
Ctrl + Shift + W: 关闭所有的 Nautilus 窗口
Ctrl + T: 在 Nautilus 打开新的 Tab
Ctrl + H: 切换隐藏文件(夹)显示或者不显示
发送当前文档给某个 Email
Ctrl + 1/2: 修改文件夹视图为图标或者列表模式
Ctrl + Shift + N: 创建新文件夹
Alt + Up/Down Arrow: 移到父一级目录
Alt + Left/Right Arrow: Nautilus 上的后退和前进
Alt + Enter: 显示所选文件或者文件夹的属性信息
Alt + Home: 直接移到你的主目录
F9: 显示和关闭 Nautilus 边栏
终端快捷键
ctrl+d=关闭终端
移动光标快捷键
向前移动一个字符
向后移动一个字符
向前移动一个单词
向后移动一个单词
移动到当前行首
移动到当前行尾
清屏,并在屏幕最上面开始一个新行
编辑命令行快捷键
删除当前的字符
交换当前字符和前一个字符的位置
交换当前单词和前一个单词的位置
把当前单词变成大写
把当前单词变成小写
把当前单词变成首字母大写的单词
添加一个特殊字符,例如,要添加一个制表符,按ctrl+v+tab
剪切、粘贴快捷键
剪切文本直到行的末尾
剪切文本直到行的起始
剪切光标前的单词
剪切光标后的单词
粘贴最近剪切的文本
回退到先前剪切的文本并粘贴它
复制、粘贴快捷键:
选中要粘贴的文本,然后转到需要进行粘帖操作的位置,最后单击中键。会将所选文本粘贴到鼠标光标所在的位置。通过鼠标中键粘贴文本与普通的剪贴板毫无关系。选中文本并不会将其复制到剪贴板中。这种快速粘贴法只能通过鼠标中键执行。
在控制台下:
鼠标选中要复制的文本,按鼠标中键,即为复制
复制命令:Ctrl + Insert组合键 或 用鼠标选中即是复制。
粘贴命令:Shift + Insert组合键 或 单击鼠标滚轮即为粘贴。
在终端下:
复制命令:Ctrl + Shift + C
粘贴命令:Ctrl + Shift + V
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
特征检测与提取
一、局部特征提取
检测SURF特征点
points = detectSURFFeatures(I);
提取特征描述子
[features,validPoints] = extractFeatures(I,points);
二、特征匹配
特征描述子匹配
indexPairs = matchFeatures(features1,features2);
显示匹配的特征点
showMatchedFeatures(I1,I2,matchedPoints1,matchedPoints2);
从匹配点对估计几何变换
tform = estimateGeometricTransform(matchedPoints1,matchedPoints2,transformType);
该函数使用随机样本一致性(RANSAC)算法的变体MSAC算法实现,去除误匹配点
三、图像拼接
图像拼接大致上由两部分组成:图像配准与图像融合。图像配准即采用算子寻找、匹配特征,进而找出重叠位置,确定变换关系等。图像融合则完成最终图像的生成与边界处理等。
或者可以分为四个步骤:特征点提取、特征点的匹配、变换矩阵的计算和图像融合;
图像配准即上面两节内容,而将变换矩阵应用于图像的几何变换与图像融合则是上一张的内容。由此即可完成整个图像拼接过程。
%基于特征点的图像拼接
[file1,filepath1]=uigetfile('*');%获取文件名
[file2,filepath2]=uigetfile('*');
file1=fullfile(filepath1,file1);
file2=fullfile(filepath2,file2);
I1=imread(file1);%读取图片
I2=imread(file2);
imgs=[I1,I2];
figure,imshow(imgs);%并排显示两幅待拼接图像
title('待拼接图像');
img1=rgb2gray(I1);
img2=rgb2gray(I2);
imageSize=size(img1);
p1=detectSURFFeatures(img1);
p2=detectSURFFeatures(img2);%检测SURF特征点
imshow(I1);
plot(p1.selectStrongest(50));
title('图1最强50特征点');
imshow(I2);
plot(p2.selectStrongest(50));%显示强度最强的50个特征点
title('图2最强50特征点');
[img1Features, p1] = extractFeatures(img1, p1);%使用64维向量表示特征描述子,
%第一个返回的参数即为每个特征点对应的特征描述子,第二个参数是特征点
[img2Features, p2] = extractFeatures(img2, p2);
boxPairs = matchFeatures(img1Features, img2Features);%特征描述子匹配
matchedimg1Points = p1(boxPairs(:, 1));%第二个参数:可以不加,因为其为n行1列的结构体数组
matchedimg2Points = p2(boxPairs(:, 2));
showMatchedFeatures(I1, I2, matchedimg1Points, ...
matchedimg2Points, 'montage');
title('Putatively Matched Points (Including Outliers)');%显示匹配的特征描述子
[tform, inlierimg2Points, inlierimg1Points] = ...
estimateGeometricTransform(matchedimg2Points, matchedimg1Points, 'projective');%射影变换,tfrom映射点对1内点到点对2内点
%该函数使用随机样本一致性(RANSAC)算法的变体MSAC算法实现,去除误匹配点
%The returned geometric transformation matrix maps the inliers in matchedPoints1
%to the inliers in matchedPoints2.返回的几何映射矩阵映射第一参数内点到第二参数内点
showMatchedFeatures(I1, I2, inlierimg1Points, ...
inlierimg2Points, 'montage');
title('Matched Points (Inliers Only)');
%load('stiching.mat');
% % % % % %%%%%%%%%%%%%%%%%%%%%%%%显示差异%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Rfixed = imref2d(size(I1));
[registered2, Rregistered] = imwarp(I2, tform);
imshowpair(I1,Rfixed,registered2,Rregistered,'blend');
title('图像差异');
[xlim, ylim] = outputLimits(tform, [1 imageSize(2)], [1 imageSize(1)]);%输出坐标范围 x:2000~6000 y:41~3000
% 找到输出空间限制的最大最小值
xMin = min([1; xlim(:)]);%1
xMax = max([imageSize(2); xlim(:)]);%6276
yMin = min([1; ylim(:)]);
yMax = max([imageSize(1); ylim(:)]);%3272
% 全景图的宽高
= round(xMax - xMin);
height = round(yMax - yMin);
%创建2D空间参考对象定义全景图尺寸
xLimits = [xMin xMax];
yLimits = [yMin yMax];
panoramaView = imref2d([height width], xLimits, yLimits);
% 变换图片到全景图.
unwarpedImage = imwarp(I1,projective2d(eye(3)), 'OutputView', panoramaView);
warpedImage = imwarp(I2, tform, 'OutputView', panoramaView);
% % %%%%%%%%%%%%%%%%%%%%%%%%%%渐入渐出融合%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MAKE MASKS FOR BOTH IMAGES
% warpedImage(isnan(warpedImage))=0;
maskA = (warpedImage(:,:,1)&0 |warpedImage(:,:,2)&0 | warpedImage(:,:,3)&0);%变换图像掩膜
newImage = zeros(size(warpedImage));
newImage(1:size(I1,1), 1: size(I1,2),:) = I1;
mask = (newImage(:,:,1)&0 | newImage(:,:,2)&0 | newImage(:,:,3)&0);%非变换图像掩膜
mask = and(maskA, mask);%重叠区掩膜
% GET THE OVERLAID REGION
[~,col] = find(mask);
left = min(col);
right = max(col);%获得重叠区左右范围
mask = ones(size(mask));
mask(:,left:right) = repmat(linspace(0,1,right-left+1),size(mask,1),1);%复制平铺矩阵
% BLEND EACH CHANNEL
warpedImage=double(warpedImage);
warpedImage(:,:,1) = warpedImage(:,:,1).*
warpedImage(:,:,2) = warpedImage(:,:,2).*
warpedImage(:,:,3) = warpedImage(:,:,3).*
% REVERSE THE ALPHA VALUE
mask(:,left:right) = repmat(linspace(1,0,right-left+1),size(mask,1),1);
newImage(:,:,1) = newImage(:,:,1).*
newImage(:,:,2) = newImage(:,:,2).*
newImage(:,:,3) = newImage(:,:,3).*
newImage(:,:,1) = warpedImage(:,:,1) + newImage(:,:,1);
newImage(:,:,2) = warpedImage(:,:,2) + newImage(:,:,2);
newImage(:,:,3) = warpedImage(:,:,3) + newImage(:,:,3);
newImage=uint8(newImage);
imshow(newImage);
title('渐入渐出融合');
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
一、常见几何变换
1.图像剪裁
J = imcrop(I,rect);
根据rect裁剪图像I,根据[xmin ymin width height]空间坐标指定裁剪矩形的大小和位置 。裁剪后的图像包含输入图像中所有由矩形完全或部分包围的像素。
2.图像旋转
B = imrotate(A,angle,method);
使用指定的插值方法method旋转图像A。
3. 图像平移
B = imtranslate(A,translation);
按照translation中指定的平移向量平移图像A。
4.图像金字塔缩减和扩展
B = impyramid(A,direction);
计算高斯金字塔减少或扩大一个级别。direction确定impyramid执行缩小还是扩展。
二、 几何坐标变换的描述
tform=maketform(transform_type,params,...);
三、 将几何变换应用于图像
B = imwarp(A,tform)
插值方式默认为线性内插
四、 将二维图像引至世界坐标(创建空间参照对象)
R = imref2d(imageSize)
要为图像指定世界(非默认空间)坐标系,可以使用 空间参照。imref2d可以让您在世界坐标系中定义2维图像的位置。您还可以使用这些对象来指定图像分辨率,包括非方形像素形状。(另一种定义世界坐标系的方法是使用图像对象XData和 YData属性 - 参见使用XData和YData属性定义世界坐标。)一个imref2d对象封装了锚定到二维图像的行和列的固有坐标与世界坐标系中相同行和列位置的空间位置之间的关系。
五、查找空间转换的输出范围
outbounds = findbounds(tform,inbounds);
估计对应于给定空间变换和一组输入边界的输出边界。tform是一个空间转换结构。inbounds是一个2 num_dims×矩阵,用于指定输出图像的下限和上限。outbounds是完全包含由输入边界表示的变换矩形的最小矩形区域的估计值。既然outbounds只是一个估计,它可能不会完全包含已变换的输入矩形。
六、根据输入空间限制查找输出空间限制
[xLimitsOut,yLimitsOut] = outputLimits(tform,xLimitsIn,yLimitsIn);
估计对应于一组输入空间限制的输出空间限制
七、图像坐标系统
MATLAB图像的坐标原点位于左上角,如图:
这幅图像的大小为710*1024
左上角放大:
在这里可以看到,像素都是方形的,而左上角的像素中心坐标为(1,1)。且所有像素中心都是整数值。
以下语句可改变默认空间坐标:
imshow(I,'XData',[-20,20],'YData',[-10,10]);
其中XData是二元素向量,第一个元素指定像素的第一列中心x的坐标,第二个元素指定像素最后一列中心x的坐标。 YData与其类似,但指定的是y的坐标。
左上角放大:
可以看到,此时的像素不再是正方形,并且现在左上角坐标为(-10,-20)。像素的中心不再都是整数值。
八、输出图像位置
[g,xdata,ydata] = imtransform(f,tform);
经几何变换后得图像并未显示在输出空间的位置,使用此函数可以获取这个信息,即xdata,ydata。使用imshow显示图像时,第二第三个返回参数可以像XData,YData参数那样使用。如:
imshow(g,'XData',xdata,'YData',ydata);
通俗来说就是,若对图像进行了几何变换,输出的图像会默认包含变换后的图像,而使用这两个返回的参数则能够在原本输出空间显示图像。
九、控制输出网格
要达到同一效果,可以在输出空间用imtransform控制输出网格。即定制其XData与YData这两个输入参数。
十、图像内插
十一、图像融合
1.直接平均融合法
2.加权平均法
3.中值滤波法
4.多分辨率处理法
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
一、基于边界的图像分割
g = abs(imfilter(tofloat(f), w)) &= T;
f 是输入图像,w 是适合点检测的模板:
,g 是包含检测点的图像。imfilter 把输出转换为输入所属的类,如果输入是整数类,并且 abs 操作不接受整数数据,那么在滤波操作中用 tofloat(f)来防止对数值的过早截取。输出图像 g 是 logical 类;值是 0 和 1。如果 T 值没有给出,那么通常基于滤波结果来选取。在那种情况下,先前的一串指令分成三个基本步骤:1) 计算滤波后的图像 abs(imfilter(tofloat(f),w));2) 从滤波后的图像的数据中找出 T 的值;3) 把滤波后的图像与T做比较。
点检测的另一种方法是在大小为 m×n 的所有邻点中寻找一些点,最大值和最小值的差超出了 T 的值,使用而二维顺序统计滤波器可以完成这个目的:
g = ordfilt2(f, m*n, ones(m, n)) - ordfilt2(f, 1, ones(m, n));
g = g &= T;
g = imfilter(tofloat(f), w);
其中w为线检测模板:
如果图中的第一个模板在图像上移动,就会对水平线(一个像素宽)的响应更强烈。对于恒定的背景,当线通过模板的中间一行时可能产生更大的响应。同样,图 中的第 2 个模板对+45°线响应最好,第 3 个模板对垂直线响应最好,第 4 个模板对
–45°线响应最好。注意,每个模板的优先方向都用比其他可能方向要大的系数加权。每个模板的系数之和为 0,这表明在恒定亮度区域中,模板的响应为 0。若每方向模板都应用于同一图像,其中一方向模板在图像中心点响应比其他模板在图像中心点响应都大,我们就说那个点与模板 i 方向的线更相关。
3.边缘检测
[g,t]=edge(f, 'method', parameters)
f 是输入图像,method 是以下列出方法中的一种,parameters 是下边说明
的附加参数。输出 g 是在 f 中被检测到的边缘点的位置为 1,而在其他地方为 0 的逻辑数组。
参数 t 是可选择的;由 edge 给出阈值,以决定哪个梯度值足够大到可以被称作边缘点。
Sobel 边缘检测算子
Sobel 检测算子的一般调用语法是:
[g,t] = edge(f, 'sobel', T, dir);
其中 f 是输入图像,T 是指定的阈值,dir 是指定的检测边缘的首选方向:’horizontal’、
‘vertical’或’both’(默认值)。
2. Prewitt 边缘检测算子
一般调用语法是:
[g,t] = edge(f, 'prewitt', T, dir);
这个函数的参数和 Sobel 参数相同。Prewitt 检测算子相比 Sobel 检测算子在计算上要简单
一点,但是比较容易产生噪声。
3. Roberts 边缘检测算子
一般调用语法是:
[g,t] = edge(f, 'roberts', T, dir);
这个函数的参数和 Sobel 参数相同。Roberts 检测算子是数字图像处理中最古老的边缘检测
算子中的一种,并且也是最简单的一种。因为在部分功能上有限制,所以这
种检测算子的使用明显少于其他几种算子(比如,Roberts 检测算子是非对称的,而且不能检测
诸如 45°倍数的边缘)。然而,在简单和速度为主导因素的情况下,Roberts 检测算子还是经常
用在硬件实现方面。
4. LoG 检测算子
LoG 检测算子的一般调用语法是:
[g,t ]= edge(f, 'log', T, sigma);
其中的 sigma 是标准差,其他参数和前边解释过的一样。sigma 的默认值是 2。和以前一
样,edge 忽略一切不比 T 强的边缘。如果 T 值没有给出或为空[ ],edge 会自动选值。将 T
设置为 0,将产生封闭的轮廓,这是我们熟知的 LoG 方法的典型特征。
5. 零交叉检测算子
这种检测算子基于的概念与 LoG 方法相同,但是卷积使用特殊的滤波函数 H 来完成,调用
[g,t] = edge(f, 'zerocross', T, H);
其他参数和 LoG 解释的一样。
6. Canny 检测算子
Canny检测算子(Canny[1986])是 edge 函数中最强的边缘检测算子。Canny检测算子的语法是:
[g,t] = edge(f, 'canny', T, sigma);
在这里,T 是向量。T=[T 1 ,T 2 ],包含在前边步骤 3)的两个阈值,sigma 是平滑滤波器的
标准差。如果 t 包括在输出参量中,t 就是二元矢量,其中包含该算法用到的两个阈值。语法
中的其余参数和其他方法中解释的一样,包括:如果 T 没有指定,就自动计算阈值。sigma 的
默认值是 1。
7.可用边缘检测算子汇总
边缘检测算子
近似导数寻找边缘
近似导数寻找边缘
近似导数寻找边缘
在使用高斯滤波器的拉普拉斯滤波 f(x,y)后,通过寻找零交叉来发现边缘
用指定的滤波器滤波 f(x,y)之后,寻找零交叉以发现边缘
通过寻找 f(x,y)的梯度的局部最大值来发现边缘。梯度由高斯滤波器的微分来计算。该方法使用两个阈值检测强的和弱的边缘,如果它们被连接到强边缘,那么在输出中只包含弱边缘。因此,这种方法更适合用于检测真实的弱边缘
二、基于区域的图像分割
1.区域生长
2.区域分离和聚合
1.四叉树分解
2.四叉树分解中的块值
3.在四叉树分解中设置块值
3.分水岭分割
1.使用距离变换的分水岭分割
D = bwdist(BW);
二值图像的距离变换是指从每个像素到最接近零值的像素的距离。
测地距离变换
D = bwdistgeodesic(BW,mask);
2.使用梯度的分水岭分割
获取梯度图像:
h = fspecial('sobel');
fd = tofloat(f);
g = sqrt(imfilter(fd, h, 'replicate') .^ 2 + ...
imfilter(fd, h', 'replicate') .^ 2);
在使用针对分割的分水岭变换之前,常常使用梯度幅度对图像进行预处理。梯度幅度图像沿着物体的边缘有较高的像素值,而在其他地方则有较低的像素值。在理想的情况下,分水岭变换可得到沿物体边缘的分水岭脊线。若梯度图像直接进行分水岭变换可能会严重过分割,所以在计算分水岭变换之前可以先平滑梯度图像。
3.控制标记符的分水岭分割
计算局部极小值区域
rm = imregionalmin(f);
其中,f 是灰度图像,rm 是二值图像,rm 的前景像素标记出局部小区域的位置。
扩展极小值
im = imextendedmin(f,h);
其中,f 是灰度图像,h 是高度阈值,im 是一幅二值图像,im 的前景像素标记了深的局部小区域的位置。
mp = imimposemin(f, mask);
其中,f 是灰度图像,mask 是二值图像,mask 的前景像素标记了输出图像 mp 中局部最小区域的期望位置。通过在内部和外部标记符的位置覆盖局部最小区域,可以改进梯度图像.
用于控制过分割的一种方法是基于标记符的概念。标记符是属于一幅图像的连通分量。我们希望有一个内部标记符集合,它们处在每个感兴趣物体的内部,而外部标记符集合包含在背景中。
标记符的选择范围可以从简单过程到更复杂的方法,涉及尺寸、形状、位置、相对距离、纹理内容等等(见第 11 章中关于描述子的内容)。指针是携带对分割有影响的先验知识的标记符。人们常常使用先验知识在每天的视觉中帮助解决分割和高级任务。最为熟悉的便是使用文本。因此,分水岭分割提供可以有效利用这些类型的知识的框架这一事实,是这一方法的突出优点。
%基于控制标记符的分水岭分割
[file,filepath]=uigetfile('*');
file=fullfile(filepath,file);
img=imread(file);%读图
imgsize=size(img);
if(numel(imgsize)&2)
i=rgb2gray(img);
imshow(i);title('灰度图');
[T,SM]=graythresh(i);
bw=im2bw(i,T);
imshow(bw);title('二值');
% % %%%%%%%%%%%%%%%%%%%%%%%%%%基于距离变换的分水岭分割%%%%%%%%%%%%%%%%%%%%%%
% imshow(gc);
D = bwdist(gc);
% figure,contour(-D,40);
imshow(-D,[]);title('距离变换图');
rm = imregionalmin(-D);%查看局部极小值区域
imshow(rm);title('查看局部极小值区域');
im = imextendedmin(-D,2);%扩展最小值
% figure,contour(im,40);
fim(im) = -255;
imshow(fim);title('合并后的局部极小值');%查看合并后的局部极小值
Lim = watershed(bwdist(im));
imshow(Lim,[]);title('基于距离变换的流域分割');
em = Lim == 0;
imshow(res);%查看掩膜图像
title('掩膜图像');
g2 = imimposemin(i, im | em);
imshow(g2);
title('强制最小');
L2 = watershed(g2);
f2(L2 == 0) = 255;
imshow(f2);
title('基于控制标记符的分水岭分割');
三、阈值分割
1.使用Otsu方法进行全局阈值分割
level = graythresh(I);
计算全局阈值,level可用于imbinarize将强度图像转换为二值图像。该graythresh函数使用Otsu方法,该方法使用最大类间方差法来计算阈值。
2.使用Otsu方法进行全局直方图阈值分割
T = otsuthresh(counts);
T是由直方图计数计算出的全局阈值,T是一个位于[0,1]范围内归一化强度值,可用于将强度图像转换为二值图像。
3.使用Otsu方法进行多级图像阈值分割
thresh = multithresh(A);
使用最大类间方差法返回一组阈值。你可以将thresh作为imquantize的输入参数,把图像转为二级图像。
4.使用边缘改进全局阈值处理
5.基于局部统计的可变阈值处理
T = adaptthresh(I);
6.使用移动平均的图像阈值处理
四、霍夫变换
1.霍夫变换
函数 hough 支持任意的默认语法:
[H, theta, rho] = hough(f);
还支持完整的语法形式:
[H, theta, rho] = hough(f, 'ThetaRes', val1, 'RhoRes', val2);
其中,H 是霍夫变换矩阵,theta(以度计)和 rho 是 ρ 和 θ 值向量,在这些值上产生霍夫变换。输入 f 是二值图像,val1 是 0 到 90 的标量,指定了沿 θ 轴霍夫变换的间距(默认是 1),val2 是 0
2.寻找霍夫变换的峰值
函数 houghpeaks 用任意默认语法
来寻找指定的峰值数:
peaks = houghpeaks(H, NumPeaks)
或者使用完整的语法形式:
peaks = houghpeaks(…, ‘Threshold’, val1, ‘NHoodSize’, val2)
其中,“…”指出来自默认语法和 peaks 的输入是持有峰值行和列坐标的 Q×2 大小的矩阵。Q 的范围是 0 到 NumPeaks,H 是霍夫变换矩阵。参数 val1 是非负的标量,指定了 H 中的什么值被考虑为峰值;val1 可以从 0 到 Inf 变化,默认值是 0.5*max(H(:))。参数 val2是奇整数的两元素矢量,指定量围绕峰值的邻域大小。当鉴别出峰值之后,邻域中的元素被置为 0。默认是由最小奇数值组成的两元素矢量大于或等于 size(H)/50。
3.提取线段
一旦一组候选的峰值在霍夫变换中被识别出来,如果存在与这些峰值相关的有意义的线段,剩下的就是决定线的起始点和终点。函数 houghlines 用默认的语法执行这个任务:
lines = houghlines(f, theta, rho, peaks);
或者使用完整的语法形式:
lines = houghlines(..., 'FillGap', val1, 'MinLength', val2);
其中,theta 和 rho 是来自函数 hough 的输出,peaks 是函数 houghpeaks 的输出。
输出 lines 是结构数组,长度等于找到的线段数。结构中的每个元素可以看成一条线,并含有下列字段:
point1:两元素向量[r1, c1],指定了线段终点的行列坐标。
point2:两元素向量[r2, c2],指定了线段其他终点的行列坐标。
theta:与线相关的霍夫变换的以度计量的角度。
rho:与线相关的霍夫变换的 ρ 轴位置。
其他参数如下:
val1 是正的标量,指定了与相同的霍夫变换相关的两条线段的距离。当两条线段之间的距离小于指定的值时,函数 houghlines 把线段合并为一条线段(默认的距离是 20 个像素)。参数 val2 是正的标量,指定合并的线是保留还是丢弃。如果合并的线比 val2 指定的值短,就丢弃(默认值是 40)。
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
阅读:1774
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
OpenCV是一个开源的BSD许可库,其中包含数百种计算机视觉算法。该文档描述了所谓的OpenCV 2.x API,它基本上是C ++ API,与基于C的OpenCV 1.x API相反。后者在opencv1x.pdf中描述。
OpenCV具有模块化结构,这意味着该软件包包含多个共享或静态库。以下模块可用:
核心 - 一个定义基本数据结构的最小模块,包括所有被其他所有模块使用的密集多维数组Mat和基本函数。
imgproc - 图像处理模块,包括线性和非线性图像滤波器,几何图像变换(调整大小,仿射和透视变形,通用基于表格的重新映射),色彩空间转换,直方图等。
视频 - 视频分析模块,包括运动估计,背景扣除和对象跟踪算法。
calib3d - 基本多视图几何算法,单个和立体相机校准,对象姿态估计,立体匹配算法以及三维重建元素。
features2d - 显着特征检点检测,特征描述子和特征点匹配。
objdetect - 检测对象和预定义类的实例(例如,脸部,眼睛,杯子,人物,汽车等)。
highgui - 一个易于使用的视频捕捉界面,图像和视频编解码器,以及简单的UI功能。
gpu - 来自不同OpenCV模块的GPU加速算法。
……其他一些辅助模块,如FLANN和Google测试包装器,Python绑定等。
本文档的其他章节描述了每个模块的功能。但首先,确保熟悉库中常用的普通API概念。
cv命名空间
所有的OpenCV类和函数都被放置在cv命名空间中。因此,要从您的代码访问这些函数,请使用说明符cv::或指令:using namespace cv;
cv::Mat H = cv::findHomography(points1, points2, CV_RANSAC, 5);
Mat H = findHomography(points1, points2, CV_RANSAC, 5 );
一些当前或未来的OpenCV外部名称可能与STL或其他库冲突。在这种情况下,使用显式名称空间说明符来解决名称冲突:
Mat a(100, 100, CV_32F)
randu(a, Scalar::all(1), Scalar::all(std::rand()))
cv::log(a, a)
a /= std::log(2.)
自动内存管理
OpenCV自动管理所有内存。
OpenCV 的内存处理是完全自动化的。
首先 std::vector, Mat, 以及其他数据结构提供了析构函数,可在需要的时候释放底层占用内存。这意味着好比是 Mat 这个数据结构而言,析构函数并不总是会释放内存,此举是为了便于数据共享。析构函数只是减少了所关联对象的引用计数器而已。如果引用计数器数值为 0 的时候对象才会被释放,因为再没有其他结构引用到该数据。同样的,当一个 Mat 实例被拷贝,实际上并没有发送拷贝数据的操作,只是引用计数值增1来记录使用关系。当然 Mat 还提供了 Mat::clone 方法来强制进行数据拷贝。示例如下:
Mat A(1000, 1000, CV_64F);
Mat B = A;
Mat C = B.row(3);
Mat D = B.clone();
B.row(5).copyTo(C);
B.release();
C = C.clone();
你会发现 Mat 和其他基础结构的使用时很简单的。但是其他一些高级类和用户自行创建的数据类型如何呢?是否也可以实现自动的内存管理呢?对于这些来说 OpenCV 提供了 Ptr&& 模板类,类似 C++ TR1 的 std::shared_ptr . 因此使用指针来替换的方法如下:
T* ptr = new T(...);
你可以使用:
Ptr&T& ptr = new T(...);
也就是说 Ptr ptr 封装了一个指向 T 实例的指针和关联该指针的引用计数,详情请看 Ptr 的详细描述。
输出数据的自动分配
OpenCV 会自动释放内存,就如同大多数时候为输出函数的参数自动分配内存一样。因此,如果一个函数有一个或者多个输入的数组 (cv::Mat 实例) 和一些输出数组,输出的数组会实现自动的内存分配和释放。输出数组的大小和类型会根据输入数组的大小和类型来自动识别。如果需要的话函数可以提供额外的参数来帮助设定输出数组的属性。
#include "cv.h"
#include "highgui.h"
int main(int, char**)
VideoCapture cap(0);
if(!cap.isOpened()) return -1;
namedWindow("edges",1);
cvtColor(frame, edges, CV_BGR2GRAY);
GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
Canny(edges, edges, 0, 30, 3);
imshow("edges", edges);
if(waitKey(30) &= 0)
一旦视频捕获模块解析到视频帧以及位深度,那么帧数组会自动通过 && 操作符进行分配。数组的边界是通过 cvtColor 函数自动分配的。它跟输入的数组具有相同的大小和位深度。因为传递了 CV_BGR2GRAY 参数给色彩转换代码,因此通道数是 1。需要注意的是帧和边界只在首次执行时候分配一次,因此紧接着的所有视频帧都具有相同的分辨率。如果你以某种方式改变了视频分辨率,那么数组就会自动重新分配
此技术的关键组件是 Mat::create 方法,需要指定数组的大小和类型。如果数组已经有指定的大小和类型了,那么该方法什么都不做。否则它会释放之前已分配的数据,如果有的话(这一部分设计到涉及计数减一并判断是否为0)然后分配一个新的缓冲区以满足数据要求。大多数函数为每个输出的数组调用 Mat::create 方法来创建,因此实现了输出数据分配的自动化。
一些值得注意的例外是 cv::mixChannels 和 cv::RNG::fill ,同时还有其他的函数和方法。他们不会分配输出数组,你必须在调用之前进行分配。
作为一个计算机视觉库,OpenCV 处理大量的图像像素,这些像素通常以每个通道8位或16位的紧凑格式编码,因此其值范围有限。此外图像上的特定操作,例如色彩空间转换、亮度对比度调整、锐化以及复杂插值(双立方,Lanczos)会产生超出范围的值。如果你只是存储最低的 8或者16位值,这会导致视觉上的伪影,从而影响进一步的图像分析。为了解决这个问题,我们可以使用所谓的“饱和算法”。例如,为了存储操作的结果 r 到一个 8 位的图像,你可以查找 0 到 255 中最接近的值:
带符号的 8 位、16类型以及不带符号的类型也使用类似的规则,在整个库的 C++ 代码都使用这个语义规则。可使用 saturate_cast&& 函数来实现类似标准 C++ 的 cast 操作。下面一行代码实现了上图中的计算公式:
I.at&(y, x) = saturate_cast&(r);
因为cv::uchar 是一个 OpenCV 8-bit 无符号整数值,因此在优化的 SIMD 代码,例如 SSE2 指令:paddusb, packuswb等等就会被使用到。这实现了与 C++ 代码类似的相同行为。
注意:当结果是32位整数时,不应用饱和度。
固定像素类型,模板使用限制
模板是 C++ 一个非常棒的特性之一,可以实现非常强大、高效以及安全的数据结构和算法。但是大量使用模板可能会大大增加编译时间和代码大小。除此之外,很难分离一个模板的接口以及相应的实现。这用来做一些基本的算法是挺好的,但是对于计算机视觉库这样可能包含数千行代码的复杂工作就不太合适。因为这个同时需要提供其他语言的支持版本,而像 Python、Java、Matlab 等编程语言并没有模板的概念,就会导致功能受限。当前的 OpenCV 实现是基于多态以及模板之上的运行时调度。这会导致运行时调度变得非常慢(例如像素访问操作)以及无法运行(泛型 Ptr&& 实现),以及可能非常不方便(saturate_cast&&()),因此当前实现使用了小的模板类、方法和函数。在当前的 OpenCV 版本中模板的使用都是受限的。
因此,对于一些可操作的基本类型来说是有一些固定的限制。也就是说,数组元素必须是如下罗列的类型中的其中一个:
8-bit 无符号整数 (uchar)
8-bit 有符号整数 (schar)
16-bit 无符号整数 (ushort)
16-bit 有符号整数 (short)
32-bit 有符号整数 (int)
32-bit 浮点数(float)
64-bit 浮点数 (double)
一组多元素的元组,但所有元素的类型必须一致,而且必须是上面几种类型。数组的元素如果是元组,相当于是多通道数组,与单通道数组也跟元组类型相反,这些元素必须是标量类型。最大的通道数是定义为 CV_CN_MAX 的常量值,当前是 512.
对于这些基本类型,OpenCV 提供了如下枚举与之对应:
CV_8U = 0 , CV_8S = 1 , CV_16U = 2 , CV_16S = 3 , CV_32S = 4 , CV_32F = 5 , CV_64F = 6
多通道 (n-channel) 类型可通过如下的选项进行指定:
CV_8UC1 … CV_64FC4 常量 (对应 1 到 4 的通道编号)
CV_8UC(n) … CV_64FC(n) 或者 CV_MAKETYPE(CV_8U, n) …
CV_MAKETYPE(CV_64F, n) 宏,当通道数量超过 4 或者未知时
注意 CV_32FC1 == CV_32F, CV_32FC2 == CV_32FC(2) == CV_MAKETYPE(CV_32F,
2), 以及 CV_MAKETYPE(depth, n) == (depth&7) + ((n-1)&&3).
意思是常量类型是根据深度形成的。占用了低位 3 比特,此外通道数量减1占用下一个 log2(CV_CN_MAX) 比特.
Mat mtx(3, 3, CV_32F);
Mat cmtx(10, 1, CV_64FC2);
Mat img(Size(1920, 1080), CV_8UC3);
Mat grayscale(image.size(), CV_MAKETYPE(image.depth(), 1));
包含更复杂元素的数组没法使用 OpenCV 进行构建和处理。此外,每个函数或者方法只能处理任何可能数组类型的一个子集。通常,算法越复杂,支持的格式子集就越小。下面是这些限制的一些典型示例:
人脸识别算法只支持 8 位灰度图以及彩色图.
线性代数函数以及大多数的机器学习算法只支持浮点数数组.
基本的函数,例如 cv:add 支持所有类型.
色彩空间转换函数支持 8位无符号、16位无符号以及32位浮点数类型.
每个函数所支持的类型的子集都是为了满足实际的需要,并且可根据用户的需求在将来进行扩展。
InputArray 和 OutputArray
很多 OpenCV 函数密集的处理2维以及多维的数组,例如使用 cpp:class:Mat 作为参数的函数,但是在某些情况下使用 std::vector&& 或者 Matx&& 更方便(例如一个点阵集合)。为了避免 API 中很多重复的代码,OpenCV 专门引入了一个 “proxy”类。一个基本的 “proxy”类就是 InputArray. 它被用来传递只读数组。而 InputArray 的派生类 OutputArray 用来在函数中指定输出数组。一般情况下你不需要关心这些中间类型(你也不能显式的定义这种类型的变量),它们都是自动被处理的。你可以假设在使用 Mat、std::vector&&、Matx&&、Vec&& 以及一些标量类型的时候会自动替换成 InputArray/OutputArray 。当一个函数包含一个可选的输入和输出数组时,你没有这样的参数也不想要有,可以传递 cv::noArray() 。
OpenCV 使用异常来表示关键错误。当输入的数据包含正确的格式以及属于指定的值范围,但是算法因为某种原因无法正确处理时就会返回特定的错误码(一般是一个布尔值变量)。
这些异常可以是 cv::Exception 类或者派生类的实例。此外 cv::Exception 是 std::exception 的派生类。因此可以使用标准的 C++ 库组件来处理这些异常。
异常是通过 CV_Error(errcode, description) 宏抛出来的,或者可以使用类 printf 函数风格的方法变种 CV_Error_(errcode, printf-spec, (printf-args)) ,或者使用断言宏 CV_Assert(condition) 检查各种条件,并在不满足的情况下抛出异常。如果你对性能非常在意的话,可以使用 CV_DbgAssert(condition) 方法,该方法只在 Debug 模式下有效。因为自动内存管理的原因,所有在发生错误时所产生的中间缓冲区会被自动的释放。你只需要在需要的时候添加 try 语句和 catch 异常即可。
多线程和可重入
当前的 OpenCV 版本是完全支持可重入的,这就是说相同的函数、类实例的 constant 方法或者是不同类实例的相同 non-constant 方法可以在不同的线程中调用。同时,相同的 cv::Mat 也可以在不同的线程中使用,因为这里有引用计数来实现特定架构的原子操作。
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
对象分析与属性
一、对象分析
1.获取对象轮廓
B = bwboundaries(BW);
获取二值图中对象的轮廓,和OpenCV中cvFindContours函数功能类似。B是一个P×1的cell数组,P为对象个数,每个cell 是Q×2的矩阵,对应于对象轮廓像素的坐标。
2.查找二值图像中的对象
B = bwtraceboundary(BW,P,fstep)
根据要查找的对象上边界上的点P来查找对象,fstep指定连接到的下一个对象像素的初始搜索方向,B保存查找到的区域的边界像素的行和列坐标。
3.绘制区域边界
visboundaries(BW);
4.查找图像的区域边界
mask = boundarymask(L);
计算表示输入标签矩阵L的区域边界的掩膜,输出的二值图像mask以1表示边界,0表示非边界。
二、区域和图像属性
1. 测定图像区域属性
stats = regionprops(BW,properties);
可以取得区域的各项属性(properties指定),如
s = regionprops(L,’Area’,’Centroid’,’EquivDiameter’);
可以求取L中所有区域的面积,质心,对应直径。
-求取二值图像中的对象
B = bwtraceboundary(BW,P,fstep);
2. 计算对象面积
total = bwarea(BW);
估计二值图像中对象的面积。注:该面积和二值图像中对象的像素数目不一定相等。
3.根据面积大小提取对象
BW2 = bwareafilt(BW,range);
从二进制图像BW中提取所有面积在range范围内的联通的组件(对象),产生另一个二进制图像BW2。range 是最小和最大尺寸(包括)的2乘1矢量。bwareafilt移除不在面积range范围内的物体。默认连接是8。
4.查找联通对象
CC = bwconncomp(BW)
返回的是联通的组件
CH = bwconvhull(BW)
计算所有对象凸包
6.获得二值图像的边缘图
BW2 = bwperim(BW)
7.根据属性从二值图像提取对象
BW2 = bwpropfilt(BW,attrib,range)
8.选择二值图中的对象
BW2 = bwselect(BW,c,r,n)
返回坐标(r,c)所在对象的二进制图像,其中n指定了连通性。默认情况下,bwselect查找4个连接的对象。
9.标记连通分量
[L,num]=bwlabel(f,conn)
连通分量就是前景图像内部单个元素之间的关系,是通过连通得到的像素集合。连通分为4连通和8连通。f为二值图像,connb表示联通方式(4或者8);L叫做标记矩阵,不同的联通分量分别用数字1,2,3…标记。num(可选)则给出找到的连通分量的总数。L为连续区域的标签矩阵。
10.创建标签矩阵
L = labelmatrix(CC)
从bwconncomp结构创建标签矩阵,labelmatrix比bwlabel,bwlabeln内存效率更高。
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
阅读:155 评论:1
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
形态学处理
二值形态学
1. 结构元素的构造与分解
Se=strel(shape,parameters);
如以下语句可以构造一个正方形结构元素:
se=strel('rectangle',[3 3]);
结构元素为:
结构元分解:
结构元B可描述为结构元B1和B2的膨胀:
B=B1膨胀B2
比如由5*5的全是1的结构元素可分解为值为1的5元素行矩阵和值为1的5元素列矩阵,结构元素的分解能获得速度提升。
2.腐蚀与膨胀
J = imerode(I,SE);
J = imdilate(I,SE)
3.开操作与闭操作
J = imopen(I,SE)
开操作即为先对图像进行腐蚀操作,在对图像进行膨胀操作
作用:去除所有不能包含结构元的部分,平滑目标轮廓,断开细的连接部分,去掉细的突出
J = imclose(I,SE)
闭操作即为先对图像进行膨胀操作,在对图像进行腐蚀操作
作用:平滑目标的轮廓,并且连接窄的断裂并填满细长的“港湾”,填满闭结构元小的洞。
4.形态学滤波器
不同顺序(不同结构元大小,不同次数)运用腐蚀膨胀、开闭操作。
5.击中或击不中变换
BW2 = bwhitmiss(BW,SE1,SE2);
6.二值图像的形态学变换
g=bwmorph(f,opration,n);
bwmorph函数可以执行许多以膨胀、腐蚀为基础的形态学操作,operation是指定的所希望运算的字符串,n是重复次数,默认为1,可以是Inf.
可进行操作包括细化,粗化,骨架,剪裁等等
7.形态学操作
删除小面积对象
BW2 = bwareaopen(BW,P)
删除二值图像BW中面积小于P的对象,默认情况下使用8邻域。
删除边界物体
IM2 = imclearborder(IM);
删除和图像边界相连的对象。若IM是二值图,imclearborder将删除和图像边界相连的对象。默认情况conn=8。
BW2 = bwulterode(BW)
区域/孔洞填充
BW2 = imfill(BW,'holes')
IM = imreconstruct(marker,mask);
通过重建开操作:对图像先进行腐蚀操作,利用腐蚀的图像作为标记,利用原图像作为模板,进行重建。
灰度形态学
1.膨胀与腐蚀
二值形态学腐蚀膨胀定义的扩展。
腐蚀:小于结构元的峰顶将被削除
膨胀:小于结构元的谷底将被弥合
2.开操作与闭操作
二值形态学开操作闭操作定义的扩展。
开操作:先腐蚀,后膨胀
闭操作:先膨胀,后腐蚀
3.形态学图像平滑
先开操作,再闭操作
可以减少或去除人为亮和暗的因素或噪声。
4.顶帽操作与底帽操作
顶帽操作:
J = imtophat(I,SE)
原图像减去图像开操作结果,去除图像暗部,突出亮部细节
最终结果:
底帽操作:
J = imbothat(I,SE)
原图像减去图像闭操作结果,去除图像亮部,突出暗部细节
最终结果:
5.纹理分割
6.粒度测定
7.形态学图像梯度
膨胀结果减去腐蚀的结果,是图像局部灰度变化的一种度量,它使输入图像中灰度级的跃变更加明显。
作者:m0_ 发表于
https://blog.csdn.net/m0_/article/details/
阅读:203 评论:1
https://blog.csdn.net/m0_/article/details/
https://blog.csdn.net/m0_/article/details/
概述:图像增强与图像复原是不同的,图像增强所要达到的目的是突出感兴趣的目标,而图像复原则是最大限度的恢复到原始图像,比如在采集时混杂入了噪声的图像,图像增强可以用灰度变换,即灰度值的大小的变换,也可以用中值滤波、频域滤波等。它们的效果可能更倾向于人的主观,如灰度变换后,感兴趣的目标变清晰了(变亮了),中值滤波使图像更平滑(不分析降质原因,增强了视觉效果),频域滤波能使边缘变清晰,但它们的结果都不一定为了去接近原始图像。
一、 灰度变换
F = imadjust(i,stretchlim(i),[0 1]);
imadjust在数字图像处理中用于进行图像的灰度变换(调节灰度图像的亮度或彩色图像的颜色矩阵)。
函数原型:J =imadjust(I,[low_ high_in],[low_ high_out])
stretchlim(i)返回两个值的数组,指定归一化后的最大和最小灰度值
F是将灰度图像i的灰度值扩展到整个灰度值空间所得到的图像。
二、 直方图
1. 直方图绘制
imhist(F);
2. 直方图均衡化
g=histeq(F,nlev);
3. 直方图规定化
g=histeq(F,hspec);
4.自适应直方图均衡化
g=adapthisteq(F);
三、空间滤波
1.线性空间滤波
g = imfilter(f, w, filtering_mode, boundary_options, size_options)
f为输入图像,w为滤波掩模,g为滤波后图像。filtering_mode用于指定在滤波过程中是使用“相关”还是“卷积”。boundary_options用于处理边界充零问题,边界的大小由滤波器的大小确定。
h = fspecial(type,parameters);
用于创建预定义的滤波算子
type制定算子类型,parameters指定相应的参数
2.非线性空间滤波
二维中值滤波
B = medfilt2(A, [m n]);
B为输出图像,mn指定邻域大小
二维顺序统计量滤波函数
B=ordfilt2(A,order,domain);
对图像A作顺序统计滤波。参数A为输入图像矩阵,order为序号,domain为滤波窗口。即对图像A中大小为domain矩阵大小内的非零像素值进行升序排序,取第order个值作为输出像素值。它的滤波概念是中值滤波的推广,中值滤波是对于给定的n个数值{al ,a2,…,an},将它们按大小顺序排列,取中间的那个值作为滤波器的输出。而在ordfilt2函数中的二维顺序统计量滤波将n个非零数值按小到大排序后处于第k个位置的元素作为滤波器的输出。
四、频域滤波
1. 傅里叶变换
2. 频域滤波器
[file,filepath]=uigetfile('*');
file=fullfile(filepath,file);
I0=rgb2gray(imread(file));
I=double(I0);
[M,N]=size(I);
I1=log(I+1);
FI=fft2(I1);
n1=floor(M/2);
n2=floor(N/2);
D=zeros(M,N);
H=zeros(M,N);
D(i,j)=((i-n1).^2+(j-n2).^2);
H(i,j)=(rH-rL).*(exp(c*(-D(i,j)./(d0^2))))+rL;
I2=ifft2(H.*FI);
I3=real(exp(I2));
Min = min(min(I3));
Max = max(max(I3));
I3=(I3-Min)/(Max-Min);
I3=im2uint8(I3);
imgs=[I0,I3];
imshow(imgs);
[name,path] = uigetfile('*');
file = strcat(path,name);
img=imread(file);
X=double(img);
I=rgb2hsv(X);
H=I(:,:,1);
S=I(:,:,2);
V=I(:,:,3);
f_high = 1.0;
f_low = 0.8;
gauss_low_filter = fspecial('gaussian', [7 7], 1.414);
matsize = size(gauss_low_filter);
gauss_high_filter = zeros(matsize);
gauss_high_filter(ceil(matsize(1,1)/2) , ceil(matsize(1,2)/2)) = 1.0;
gauss_high_filter = f_high*gauss_high_filter - (f_high-f_low)*gauss_low_
log_img = log(double(V)+eps);
high_log_part = imfilter(log_img, gauss_high_filter, 'symmetric', 'conv');
high_part = exp(high_log_p}

我要回帖

更多关于 sss级喰种 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信