RT
转载于:https://www.cnblogs.com/skkyk/p/11568803.html
本文主要介绍python中的变量(list, dict, ndarray 类型)怎么保存为.mat文件( matlab 使用)
方法:使用scipy库中的scipy.io.savemat(savePath, maydict={…})函数
import scipy.io import ... ... ... ... #假设你要保存的变量为 bData and aData #将bData 和 aData保存到result.mat中 scipy.io.savemat('result.mat', mdict={'bData': bData, 'aData': aData,}) #此时result.mat包含一个cell,内容是名为'bData'和'aData'的struct python中的变量(list , dict , ndarray类型)保存为.mat文件时,变量类型的对应关系
list —>cell (list内容为 dict 或 ndarray)dict—>struct 若dict内容为list,且每个list长度不一,那么保存时会发生错误,为了避免该类错误,需要将list转换为ndarray。list—>mat矩阵(list内容为字符串或数值)a.若list内容为字符串+数值或都为字符串,在保存时,将数值型数据转换为字符串,a1.若list第一个元素为数值型数据,此时mat矩阵的列数为list[i]最长的长度(若list[i]最长的长度小于11则mat矩阵的列数为11),其他长度不足的补空格,所以一般都将list转换为ndarray再保存;a2.若list第一个元素为字符串,此时mat矩阵的列数为list[i]最长的长度,其他长度不足的补空格。b.若list内容为纯数值,则保存的mat矩阵元素为数值。对于a1情况会报警告: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use arr[tuple(seq)] instead of arr[seq]. In the future this will be interpreted as an array index, arr[np.array(seq)], which will result either in an error or a different result.
工业相机如何选型 </div> 原标题:工业相机如何选型
工业相机如何选型?
工业相机是机器视觉系统中的一个关键组件, 工业相机一般安装在机器流水线上代替人眼来做测量和判断, 选择合适的相机也是机器视觉系统设计中的重要环节,那如何选择合适的工业相机呢?选择工业相机镜头时,要注意哪些问题呢?下面我们就一起来了解下吧。
需求分析
准确地描述机器视觉系统需要完成的功能和工作环境,对于整个机器视觉系统的成功集成是至关重要的。对于需求的描述,实际定义了视觉系统工作的场景,而围绕这个场景设计1个系统来获取合适的图像,并提取有用的信息或控制生产过程就是我们工作的目标。
选型需求分析
如何选择合适的工业相机
1、面阵相机/线阵相机
对于静止检测或者一般低速的检测,优先考虑面阵相机,对于大幅面高速运动或者滚轴等运动的特殊应用考虑使用线阵相机;
2、分辨率的选择
首先考虑待观察或待测量物体的精度,根据精度选择分辨率。相机像素精度=单方向视野范围大小/相机单方向分辨率。则相机单方向分辨率=单方向视野范围大小/理论精度。
若单视野为5mm长,理论精度为0.02mm,则单方向分辨率=5/0.02=250。然而为增加系统稳定性,不会只用一个像素单位对应一个测量/观察精度值,一般可以选择倍数4或更高。这样该相机需求单方向分辨率为1000,选用130万像素(1280*960)已经足够。
其次看工业相机的输出,若是体式观察或机器软件分析识别,分辨率高是有帮助的;若是VGA输出或USB输出,在显示器上观察,则还依赖于显示器的分辨率,工业相机的分辨率再高,显示器分辨率不够,也是没有意义的;利用存储卡或拍照功能,工业相机的分辨率高也是有帮助的。
3、帧率的选择
尽可能选取静止检测,这样整个项目成本都会降低很多,但是会带来检测效率的下降,对于有运动的,选用帧曝光相机,行曝光相机则会引起画面变形,对于具体帧率的选择,不应盲目的选择高速相机,虽然高速相机帧率高,但是一般需要外加强光照射,带来的高成本以及图像处理速度也压力巨大,需要根据相对运动速度来定,只要在检测区域内,能捕捉到被测物即可,比如观测长度方向1米的视野,被测物以10米/秒的运动速度穿过视野,只需要10-12帧/秒的速度就完全可以捕捉到被测物,但同样速度穿过0.1米的视野,则需要100-120帧/秒的相机才行。
4、与镜头的匹配
传感器芯片尺寸需要小于或等于镜头尺寸,C或CS安装座也要匹配。
相机和镜头的匹配
选择工业相机镜头时的注意事项:
1.接口类型:C接口还是CS接口,C接口的接口距离是17.5mm,CS接口的接口距离是12.5mm,用错了就不能合焦;
2.相机与镜头的匹配:要根据感光器件的大小来选择镜头,是2/3寸感光芯片的要选择对应成像圈的镜头,如果选择了1/3"或1/2“的,会出现很大的暗角。
3、相机颜色:工业上的视觉检测,一般推荐使用黑白相机,因为软件处理一般都是转换为灰度数据来处理,所以一般情况下使用黑白相机,主要检测以颜色为特征识别的项目时用彩色相机。
4.景深与光环境的配合,光线充足,配备光源照射的地方可以选用小光圈,加大景深,提高拍摄清晰度。光线不足的地方需要稍大一点的光圈或采用高感光度的感光芯片。
问题的背景 并非世界上每一个人都讲一种语言。也并非世界上每一个人都会以相同的方式格式化他(她)的数字、日期和货币。
您可能会疑惑为何这现在才成为了问题。网站已经出现多年,且各个国家已经存在了上万年。问题之所以越来越尖锐是因为我们越来越多地看到网站在客户端完成更多的工作,而不是依赖于服务器或依赖于 Ajax 客户端调用来完成工作。对于每项工作,开发人员现在都想要一种纯客户端的解决方案。
让我们看一个简单的例子来证明我的观点。假设,您是一个名为 “Double It!” 的 Web 应用程序的所有者。当一个用户在一个文本字段中输入一个数字时,在其下的一个 SPAN 内,用户只要单击一个按钮,这个数字就会加倍。这看上去非常简单,但是当美国的一个用户来到这个网站并向文本字段键入 “1,250.25” 时,您的应用程序就会给出响应,即 “2,500.5”。您可以编写一些客户端 JavaScript 来轻松实现这一目的。
$("#reponseSpan").text(2 * new Number($("#inputTextField").val())); 现在,有一个德国用户来到这个网站。他们书写数字的方式与美国用户不同。德国人输入的是 “1.250,25”。如果您仍使用与为美国客户编写的相同的 JavaScript,就会在它试图创建这个 Number 对象时得到一个 JavaScript 错误。那么为何会如此呢?因为内置的 JavaScript 函数预期的数字的格式是美国格式,而您的德国访客不会按这种方式键入。
您虽然可以指导您网站的用户输入所有数字时都采取美国格式,但 这真的是最佳答案吗?您是想要强迫用户按您的方式做事,还是想要接受用户自行选择的做事方式并让用户体验尽量的完美。
表 1 显示了数字的一些可能格式,也例证了 Globalize 插件为何是最佳解决方案。
表 1. 不同国家的数字格式 国家数字格式美国1,250.25德国1.250,25法国1 250,25瑞士1'250,25 文化 Globalize 插件是如何解决前述这些问题的呢?他们从文化的角度来构建这个解决方案。一种文化不应被视为是一种语言,因为世界上的很多国家都讲的是相同的语言,比如西班牙语。同样地,一种文化也不应被视为是一个国家,因为有一些国家具有多种官方语言,比如瑞士。相反,文化的概念可以被视作是国家和 语言的惟一组合。因此,虽然西班牙语不是惟一的,西班牙也不是惟一的,但是二者的组合西班牙语-西班牙就是惟一的,因此可被视为是一种文化(以区别于西班牙语-墨西哥和加泰罗尼亚语-西班牙)。
当您将世界上的所有这些惟一的语言和国家进行排列组合时,会发现有近 350 种文化需要受到支持。(这也是为什么您甚至都不会指望能独自快速找出解决方案。) Globalize 插件在构建文化时,它使用了两个分别由两个字母组成的代码。第一个代码是两个字母小写语言代码,称为 ISO 639 码,第二个代码是两个字母大写国家代码,称为 ISO 3166 码。例如,“en-US” 表示的是英语和美国文化,“fr-FR” 表示的是法语和法国文化。
同样重要的是文化的 “中立”。实际上,Globalize 插件有这样一个原则,即 “如果您无法获得具体的语言和国家信息,那么您可以绕过语言,我们会对如何进行正确的格式化做出最佳的猜测”。这无疑是一个很大的帮助,本文稍候会详述。浏览 Web 的人易于标识他们所讲的语言,但确定其国家代码有时会很困难。
用 JavaScript 设置文化 了解了问题的背景以及 Globalize 插件如何使用 Culture 对象来提取底层的细节后,让我们来看看该如何使用 JavaScript 设置文化。
现在,假定你已经完全掌握了暂存区的概念。下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
为什么说Git管理的是修改,而不是文件呢?我们还是做实验。第一步,对readme.txt做一个修改,比如加一行内容:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.
然后,添加:
$ git add readme.txt
$ git status
On branch master
Changes to be committed:
(use “git reset HEAD …” to unstage)
modified: readme.txt
然后,再修改readme.txt:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
# -*- coding: utf-8 -*- import cv2 as cv import numpy as np def cv_filter2d(img_path): src = cv.imread(img_path) kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]) dst = cv.filter2D(src, -1, kernel) cv.imshow('original', src) cv.imshow('dst', dst) cv.waitKey(0) cv.destroyAllWindows() img_path = r"C:\Users\RoseC\Desktop\2_cut.png" cv_filter2d(img_path)
点击水波纹效果 FlatButton;
FlatButton( //长按时颜色 highlightColor:Colors.red, //点击的水波纹颜色 splashColor: Colors.blue, onPressed: onPressed, child: Text(text, style: TextStyle( fontSize:20, fontWeight: FontWeight.w400)), shape: RoundedRectangleBorder( side: BorderSide( color: Colors.black, style: BorderStyle.solid, width: 1), ), )) InkWell:
这里有个问题,InkWell子布局添加颜色后点击就无法展示水波纹了,子布局将父布局覆盖了。
InkWell( onTap: () {}, highlightColor: Colors.blue, splashColor: Colors.red, child: Container( color: Colors.white, height: 100, width: 100, child: Text('点我'), ), ) 点击区域问题 GestureDetector包裹子控件,点击空白区域点击无效解决方案:
设置GestureDetector的behavior属性:
如: GestureDetector( behavior: HitTestBehavior.translucent, onTap: callback, child: Container( padding: EdgeInsets.only(right: ScreenUtil().setHeight(30)), alignment: Alignment.centerRight, child: Image.asset( LocalIcons.
前言: LOAM和单线激光雷达的hector算法比较像,都可以在无IMU数据的情况下建图
LOAM细节分析: 链接: https://zhuanlan.zhihu.com/p/57351961.
环境: Ubuntu16.04、ROS-kinect、PCL1.8
步骤: 1、LOAM安装:参考链接: https://blog.csdn.net/qq_36396941/article/details/82973772.
2、数据集:ROS官网上链接: http://wiki.ros.org/loam_velodyne。提供了无IMU数据的数据集
链接: https://pan.baidu.com/s/18ISyr4ky2MfTl7TXJD2W-A 提取码: 2yea 3、运行:
roslaunch loam_velodyne loam_velodyne.launch rosbag play --clock nsh_indoor_outdoor.bag 4、保存最后的三维点云地图
在运行建图时(或者后半段时间),启动一个录制节点
rosbag record -o out1.bag<输出的bag文件名称> /laser_cloud_surround<话题名称> pcd<好像是可有可无> 然后将上述的bag文件转为pcd文件
rosrun pcl_ros bag_to_pcd <bag_name> /laser_cloud_surround pcd32 查看最后一个PCD文件(建好的点云地图)
pcl_viewer last_pcd.pcd 注意:
1、以上图片是使用的32线Velodyne的bag文件,见链接: https://pan.baidu.com/s/103qabm_WBNEkd81x9AoVaA 提取码: 49rd 复制这段内容后打开百度网盘手机App,操作更方便哦
2、在播放数据包时候,可能会因为话题不是一个而无法正常运行,在launch文件中remap: https://blog.csdn.net/u013453604/article/details/50381999.又比较麻烦.可以在播放bag文件时就进行话题的重命名:rosbag play --clock test.bag /velodyne_points:=/velodyne,此处就是将bag文件中的话题/velodyne_points重命名为/velodyne。
2、LOAM建图生成的PCD文件链接: 链接: https://pan.baidu.com/s/1JOOsWuTdA_sns9-VLCOYWQ 提取码: jqt6 复制这段内容后打开百度网盘手机App,操作更方便哦.
前言: 自从知道有nginx这个东西之后,一直都没有去做过多的了解,只是粗浅的知道能够代理域名、放置静态资源以便分担服务器压力这样的东西,连正向代理和反向代理的定义都不知道.
一、正向代理与反向代理 正向代理位于原始服务器和客户机之间,他的作用是代替客户机发请求,例如用于保护客户机,VPN技术.
反向代理则是在服务器端进行的代理操作,常见的有改变域名和请求分发.
改变域名其实就是为了外界访问,比方说www.baidu.com,如果通过最原始的IP进行访问,谁记得住这个IP是百度,那个IP是CSDN呢?
请求方法是当数据量变大的时候才会用到的,请看下面这个图:
nginx在接受到客户端的请求后,将请求分发到各个服务器上,以此达到减轻服务器压力的作用.
当然了,请求分发就意味着很多很多的问题,我们用一台服务器的时候,可以用session来检测用户的登录状态,但是服务器与服务器之间不共享session等这里就不一一列举了.
二、搭建一个基本的nginx,实现域名的改变(windows系统) 1.去官网上下载nginx:http://nginx.org/en/download.html
Mainline version: Mainline 是 Nginx 目前主力在做的版本,可以说是开发版(Youtube看官网视频 推荐开发者使用这个版本)
Stable version: 最新稳定版,生产环境上建议使用的版本
Legacy versions:遗留的老版本的稳定版
Source Code: 源码
Pre-Build Packages: 预编译版本
我下的是Mainline版本.下载完成解压.直接点.exe文件不太好使,还是用cmd敲命令行管事.
2.启动nginx服务器
先分享一下nginx常用的命令:
查看Nginx的版本号:nginx -V
启动Nginx:start nginx
快速停止或关闭Nginx:nginx -s stop
正常停止或关闭Nginx:nginx -s quit
配置文件修改重装载命令:nginx -s reload
好的,我们打开解压后的文件夹,按住shift的同时鼠标右键点击,打开powershell(windows10,其实cmd就可以,我只是省去了cd命令).输入完start nginx,弹了个黑框框,一眨眼的功夫就没了,当然如果你电脑够快可能自己都没注意到…
然后打开浏览器输localhost,应该就能看到跟nginx相关的网页了.
接下来我就准备着手改变域名了,用notepad++打开conf文件夹下的nginx.conf,该文件中具体每一项的意思具体请点击链接:https://blog.csdn.net/weixin_42167759/article/details/85049546
修改conf文件
server { listen 80; server_name www.gaimeng.com; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; proxy_pass http://www.
文章目录 1、引言2、常规调幅调制(AM)调制器模型3、AM信号的傅立叶变换4、AM信号功率与调制效率5、抑制载波双边带(DSB-SC)调制 1、引言 考虑我们用麦克风采集语音信号,完成声-电转换,得到的电信号频率范围在20Hz~20kHz之间,显然属于低通信号。语音(电)信号为模拟随机信号,取值和时间上都是连续的,我们用 m ( t ) m(t) m(t)表示。图1中,我们用录音机获取了周杰伦新歌《说好不哭》大约24s的音频,左边图为波形,右边为频率。不难看出,主要频率集中在零频到7kHz之间。
图1 模拟基带信号 现在的问题是,如果我们想把类似图1中的这样的基带信号辐射到空间中,即采用无线方式进行传输,我们需要一定长度的天线。作为估算,一般来说我们认为天线长度需要等于无线电波长的 1 4 \frac{1}{4} 41(当然真正做天线设计时需要更准确的计算),这就意味着,如果我们的基带信号频率为3kHz,波长 λ = c f \lambda=\frac{c}{f} λ=fc,这里的 f = 3 f=3 f=3kHz为信号频率, c = 3 × 1 0 8 c=3\times 10^8 c=3×108m/s为光速,因此天线长度大约需要2.5km,显然这是不可能的。如果我们把信号频率提升到300MHz,则天线长度只需要0.25m。
我们还可能遇到这样一个问题。在无线传输中,由于所有无线信号都在空中叠加,因此会产生严重干扰,因此需要通过无线电管理,为不同系统分配不同带宽。以4G移动通信系统为例,包括1880-1900MHz、2320-2370MHz、2575-2635MHz等。这也意味着,我们需要将低通语音或者数字信号的频率升高,变为带通信号,才能够在分配的频段内传输。当然,在接收端需要将信号从带通再进行下搬移,变回低通信号。而这种低通变带通,带通变低通的过程,就称为信号的调制与解调。
这一讲,主要介绍模拟幅度调制,包括常规调幅调制(AM)、抑制载波双边带(SSB-SC)调制以及单边带(SSB)调制。
2、常规调幅调制(AM)调制器模型 AM调制器模型如图1(a)所示。显然有
s A M ( t ) = A c [ 1 + m ( t ) ] cos 2 π f c t . (1) \tag{1} s_{\rm AM}(t)=A_c[1+m(t)]\cos 2\pi f_ct.
3、窄带高斯白噪声 下面我们用分析窄带高斯白噪声的复包络(低通)表示。对于窄带高斯白噪声 n ( t ) n(t) n(t),我们可以求得它的解析信号以及复包络分别为
z n ( t ) = n ( t ) + j n ^ ( t ) , z_n(t)=n(t)+j\hat n(t), zn(t)=n(t)+jn^(t),进一步,可以得到 x ( t ) x(t) x(t)的复包络信号为
n L ( t ) = z n ( t ) e − j 2 π f 0 t = n c ( t ) + j n s ( t ) \begin{aligned} n_L(t)&=z_n(t)e^{-j2\pi f_0t}\\ &=n_c(t)+jn_s(t) \end{aligned} nL(t)=zn(t)e−j2πf0t=nc(t)+jns(t)这里的 n c ( t ) n_c(t) nc(t)和 n s ( t ) n_s(t) ns(t)分别为 n ( t ) n(t) n(t)的同相和正交分量。因此,我们可以将 n ( t ) n(t) n(t)表示为
1, 缩放
缩放,使用cv2.INTER_AREA
扩展,使用cv2.INTER_CUBIC和cv2.INTER_LINEAR
img = cv.imread('./data/messi5.jpg') result = cv.resize(img, None, fx=2, fy=2, interpolation=cv.INTER_CUBIC) # w,h都放大两倍 # height, width = img.shape[:2] # result = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC) cv.imshow('img', img) cv.imshow('res', res) cv.waitKey(0) cv.destroyAllWindows() 2,平移
img = cv.imread('./data/messi5.jpg') rows, cols = img.shape[:2] M = np.float32([[1,0,100],[0,1,50]]) # (x,y) -> (100,50) dst = cv.warpAffine(img, M, (cols, rows)) 3,旋转
img = cv.imread('./data/messi5.jpg') rows,cols = img.shape[:2] # 这里的第一个参数为旋转中心,第二个参数为旋转角度,第三个参数为旋转后的缩放因子 # 可以设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题 M = cv.
仿抖音❤️点赞 双击点赞 swift 版本
源码 : https://github.com/sinorychan/DouYinLikeAnimation
一 配置文件
<?xml version="1.0" encoding="GBK"?> <!-- 指定Hibernate配置文件的DTD信息 --> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <!-- hibernate-configuration是配置文件的根元素 --> <hibernate-configuration> <session-factory> <!-- 指定连接数据库所用的驱动 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 指定连接数据库的url,其中hibernate是本应用连接的数据库名 --> <property name="connection.url">jdbc:mysql://localhost/hibernate</property> <!-- 指定连接数据库的用户名 --> <property name="connection.username">root</property> <!-- 指定连接数据库的密码 --> <property name="connection.password">32147</property> <!-- 指定连接池里最大连接数 --> <property name="hibernate.c3p0.max_size">20</property> <!-- 指定连接池里最小连接数 --> <property name="hibernate.c3p0.min_size">1</property> <!-- 指定连接池里连接的超时时长 --> <property name="hibernate.c3p0.timeout">5000</property> <!-- 指定连接池里最大缓存多少个Statement对象 --> <property name="hibernate.c3p0.max_statements">100</property> <property name="hibernate.c3p0.idle_test_period">3000</property> <property name="hibernate.c3p0.acquire_increment">2</property> <property name="hibernate.c3p0.validate">true</property> <!-- 指定数据库方言 --> <property name="
2 开头 (请求成功)表示成功处理了请求的状态代码。
200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
201 (已创建) 请求成功并且服务器创建了新的资源。
202 (已接受) 服务器已接受请求,但尚未处理。
203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
206 (部分内容) 服务器成功处理了部分 GET 请求。
3 开头 (请求被重定向)表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
4 开头 (请求错误)这些状态代码表示请求可能出错,妨碍了服务器的处理。
400 (错误请求) 服务器不理解请求的语法。
Java实例大全 @Test public void test(){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");//格式化时间 a为上午/下午 Date date = new Date();//获取当前时间 String dateString = sdf.format(date);//格式化 System.out.println("当前时间: "+dateString); } 结果:
当前时间: 2019-09-18 10:38:19 上午
日期和时间模式(注意大小写,代表的含义是不同的):
yyyy:年MM:月dd:日hh:1~12小时制(1-12)HH:24小时制(0-23)mm:分ss:秒S:毫秒E:星期几D:一年中的第几天F:一月中的第几个星期(会把这个月总共过的天数除以7)w:一年中的第几个星期W:一月中的第几星期(会根据实际情况来算)a:上下午标识k:和HH差不多,表示一天24小时制(1-24)K:和hh差不多,表示一天12小时制(0-11)z:表示时区
写一个bool类型的comp函数,比如下面根据第二个元素排序:
bool cmp1(const vector<int> &a, const vector<int> &b){ return a[1] > b[1]; } sort(allvec.begin(), allvec.end(), cmp1)
HSV颜色分量范围
一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。
H: 0— 180
S: 0— 255
V: 0— 255
此处把部分红色归为紫色范围:
黑
灰
白
红
橙
黄
绿
青
蓝
紫
hmin
0
0
0
0
156
11
26
35
78
100
125
hmax
180
180
180
10
180
25
34
77
99
124
155
smin
0
0
0
43
43
43
43
43
43
43
smax
255
43
30
255
255
255
255
255
255
255
vmin
JSP知识点: JSP技术是以Java语言作为脚本语言的,JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序 <html> <head> <title>第一个JSP程序</title> </head> <body> <% out.println("Hello World!"); %> </body> </html> JSP生命周期 编译阶段:
Servelet容器编译Servelet源文件,生成servelet类
初始化阶段
加载与JSP对应的Servelet类,创建其实例,并调用它的初始化方法
执行阶段
调用与JSP对应的Servelet实例的服务方法
销毁阶段
调用与JSP对应的Servelet实例的销毁方法,然后销毁Servelet实例
JSP语法: 标签 <% 代码片段 %> 在HTML网页中插入Java代码。标签通常以<%开头以%>结束
<jsp:scriptlet> 代码片段 </jsp:scriptlet> 注释 <%-- --%> 输出 <%=age%> JSP指令 <%@ page ... %>
定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include ... %>
包含其他文件
<%@ taglib ... %>
引入标签库的定义
九大内置对象: final javax.servlet.jsp.PageContext pageContext;
PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问
javax.servlet.http.HttpSession session
HttpSession类的实例
final javax.servlet.ServletContext application;
ServletContext类的实例,与应用上下午有关
final javax.servlet.ServletConfig config;
ServletConfig类的实例
javax.servlet.jsp.JspWriter out
前言今天在调用很久写的zk相关代码 创建节点突然创建异常。。。异常信息如下
org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented for /test
at org.apache.zookeeper.KeeperException.create(KeeperException.java:106)
at org.apache.zookeeper.KeeperException.create(KeeperException.java:54)
at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:1637)
at org.apache.curator.framework.imps.CreateBuilderImpl$17.call(CreateBuilderImpl.java:1189)
at org.apache.curator.framework.imps.CreateBuilderImpl$17.call(CreateBuilderImpl.java:1166)
at org.apache.curator.connection.StandardConnectionHandlingPolicy.callWithRetry(StandardConnectionHandlingPolicy.java:64)
at org.apache.curator.RetryLoop.callWithRetry(RetryLoop.java:100)
at org.apache.curator.framework.imps.CreateBuilderImpl.pathInForeground(CreateBuilderImpl.java:1163)
at org.apache.curator.framework.imps.CreateBuilderImpl.protectedPathInForeground(CreateBuilderImpl.java:603)
at org.apache.curator.framework.imps.CreateBuilderImpl.forPath(CreateBuilderImpl.java:593)
at org.apache.curator.framework.imps.CreateBuilderImpl.forPath(CreateBuilderImpl.java:571)
at org.apache.curator.framework.imps.CreateBuilderImpl$4.forPath(CreateBuilderImpl.java:459)
at org.apache.curator.framework.imps.CreateBuilderImpl$4.forPath(CreateBuilderImpl.java:389)
at com.google.zookeeper.lock.DistributeLock.main(DistributeLock.java:29)
简单地创建代码如下
//初始化 CuratorFramework framework = CuratorFrameworkFactory.builder().connectString("zk服务地址") .connectionTimeoutMs(5000) .retryPolicy(new ExponentialBackoffRetry(3000, 3)) .build(); framework.start(); try { String s = framework.create().creatingParentsIfNeeded().forPath("/test"); System.out.println("s=="+s); } catch (Exception e) { e.printStackTrace(); } 看到错误就不淡定了。。。 直接度娘一发 发现是curator 和 zookeper 版本兼容问题
看下了下官方给的版本对比文档 官方文档链接 ZooKeeper 3.