【源码阅读系列】SQLite-连载中

想读一些代码,但不知道从哪里开始,那就随便选一个吧。

前言

为什么要写这个系列。

1、就是想变厉害一点:

学习更多数据结构和算法学习被广泛应用的软件/库的源码的实现原理学习别人的编码习惯和技巧

那开源项目那么多,从哪一个开始读呢,Nginx?Linux?还是什么,于是就谷歌,找到这个网页:
https://www.zhihu.com/question/20201738
介绍了很多开源项目,于是乎决定写这个系列,先把系列的开头放在这篇文章,如果坚持读代码并且写日志分析了三个开源项目,就把给这个系列做一个新的页面。

2、博客总要写一点有用的东西

一直想写博客,可是不知道些什么好。

读书笔记实在没意思,读过再多别人读了也能懂,而且网上随手一搜那么多reference,凭什么会看你的。

设计分析倒是不错的选择,但是比如最近在公司设计的网络模型,放在外面不知道算不算侵犯公司的知识产权,就算不算,可我也不是天天都会设计模型啊,毕竟设计好了一个,实现之后维护的时间更多。

想来想去,正好想学更多东西,那就用源码阅读的笔记来填满我空虚的博客吧,于是决定尝试写这个系列。

一、SQLite

昨天读了一下Webbench,实在没什么值得记录的,就是单纯的根据命令行的配置准备好需要发送的HTTP指令,然后不停的fork(),send,fork(),send。

然后第二个选择读SQLite的代码。下载下来看到有十几万行代码(我用的版本是3.14.1)。

二、目录树

 

待续……

争取每天写一点点

 

有些事儿,开个头,世界就变了。

很久没更新了,现在在腾讯实习,机器学习啊,机器视觉的事儿暂时都放下了,在做网络方面的编程,从7.16入职到现在,还是真的学会了不少东西。

有些事儿,开个头,世界就变了。

不是以前不会Linux网络编程,只是没有在这里实践这么深刻,听那些员工讨论之后对网络的认识,对架构的认识真的非常的不相同。

世界变了之一:

之前自己对一个项目的认知就是,在变成过程中,遇到某些边界条件要想清楚。

现在对一个项目好坏的认知是,当你这个依赖的其他服务挂掉,你这个程序要能撑住;当集群中某一台机器挂掉,不会引起雪崩效应;要能够容易扩容…之类之类的。

评价从项目中的代码到了项目与项目之间的联系,对未来的扩容能够简单高效,对服务器的边界条件能够自动化适应。

这是一个收获。

世界变了之二:

开始使用开源代码,开始开发开源框架,然后就发现…那些开源代码,真的不是编码厉害,用的函数都是一样的函数,你顺着函数一层一层跟着走,函数做的功能跟你想的顺序是差不多的。

那开源世界的代码厉害在哪里?

愚见:

其一,边界条件处理的很好,不会因为一些异常忽然挂掉,这是自己造轮子容易遇到的问题。

其二,虽然顺着函数走功能和想象之中是一样的,但是哪段代码该放在一个函数,函数与函数的调用,函数与数据结构的依赖,才是每个项目最核心的。

感触好多,但用文字总结起来都是一些很虚的话,今天先到这。

 

PS:今天看网站才发现挂掉了,大概是因为内存的原因,然后开启了swap在使用,重启了一下 nginx,php-fpm和mariadb。

PSPS:话说mariadb真的很坑爹啊,挂掉了你倒是在日志里写一下内存不足啊,一大堆无关紧要的日志。

PSPSPS:今天记住了一个很厉害的命令,sysctl,可以直接修改/proc/sys里面的变量值。

想认真学一下/proc/sys里面的各个文件的意义~先成为一个Linux大师。

四轴飞行器——Robotics: Aerial Robotics笔记

1、基本原理:

电机与力的关系

转子(rotor)产生的升力和转速的平方成正比,转子在旋转时自身需要克服阻力力矩与转速的平方成正比(如图中过原点的两条曲线)

电机(motor)大小决定后,就会产生扭矩来克服转子的阻力力矩,产生的扭矩和转速的关系如上图第三条曲线。

悬停的基本原理。

悬停的基本原理。

如上图所示,可以通过飞行器的重量确定转子的转速,通过转子的转速来确定电机会产生的扭矩。

(我个人的理解大概是转子本身产生的就是向上的力,用于控制加速度,而转动一定会产生扭矩,扭矩作用在飞行器上就会让飞行器旋转。)

2、控制方式:

(这一部分注意力将只在垂直方向,来控制高度。)

控制方式

控制方式

PID和PD的介绍,因为做过飞行器,早就对这些有一些自己的理解 ~ 就不做什么笔记了。
不过记一下,PD是一个二次系统,PID是一个三次系统。

岭回归(对岭迹图的理解)

《机器学习实践》是一本好书!在你了解原理的情况下,看作者的Python实现真的是一件很享受的事情,原理性的东西被这样简洁的实现出来,看着心里很舒服。

但是如果你不懂原理,就比如岭回归,比如SVM,忽然冒出来一个公式(岭回归的参数求解公式),就很难知道为何这样编程

岭回归的求解公式:

网上搜来搜去,发现就是Andrew视频教程里提到的正则化:
(书中是用线性代数求解的,Andrew是用迭代求解,并无太多差异。)

图1

公式是对代价函数求导,令倒数为0,这样求出的。

但是有一个问题是如何确定λ,或者是用哪一个λ比较合适呢?

Andrew说正则化是用于避免过拟合,见上图的代价函数J,因为加入了最后和λ相关的约束项,系数的大小会进入代价函数,所以求解出来的系数过大会被惩罚,因此可以减小系数,达到防止过拟合的目的。

但是Andrew并未(也许是我忘了)提到岭这个词,也没提到岭迹,岭迹就是从小到大枚举λ,对每个λ求解参数向量θ,常用的处理是画出θ-λ的图像,如下图所示:

图2

见图2中代价函数J的公式,当λ为0时就是线性回归;当λ非常大时,最后系数的惩罚特别大,远大于对数据拟合的代价函数,因此会让所有系数为0,以上是我对岭迹图的理解。

至于如何选择,这又是另外一门学问,在下面的PPT中有一些介绍:
http://yyhgfx.jpk.ccut.edu.cn/u_newsfiles/1363574289/20130325/20130325092274807480.ppt

通过岭迹不仅可以选择合适的λ,还能删除,合并一些的数据。

 

附上几篇回归的文章:

线性回归建模–变量选择和正则化:
http://site.douban.com/182577/widget/notes/10567212/note/288551448/

统计学习那些事:
http://cos.name/2011/12/stories-about-statistical-learning/

局部加权线性回归(locally weighted linear regression)

转自:http://blog.csdn.net/allenalex/article/details/16370245

在线性回归中,对于给定的训练集,用一个线性表达式来拟合所有数据,当训练集中输入变量和目标变量之间的确存在线性关系时,通常拟合的很好。但是如果没有明显的线性关系的话,可能就拟合不到好的效果了。比如下面坐标表示的情形,用一条直线来拟合图上的点显然不是很合适。

欠拟合

这种情况叫做欠拟合(underfitting)。
通常来说,对待这种情况,特征的选择可能会非常的重要,比如,对于上面的图,如果加特征:x的平方,或者其他比如sin(x)可能能够实现很好的拟合这些点。我们这里要介绍的局部加权(线性)回归(locally weighted linear regression),在保证有足够训练数据的前提下,能够使得特征的选择没有那么关键。
线性回归算法中,给定一个查询点x,要预测其对应的y(也就是h(i)),处理方法如下:

1.选择合适的参数向量最小化
2.输出
局部加权回归的处理方式如下:
1.选择合适的参数向量最小化
2.输出
与线性回归的区别显然是在第一步中多了一个权值w(i)。这个权值也就是改方法为什么叫做“加权“,同时从后面的解释,你会发现它也是能够说明为了该方法又包含”局部“的原因。
这个权值怎么定义?又有什么用呢?
显然,在线性回归中,给定某个值,预测其对应的输出时,是通盘考虑所有的训练数据集。从上面的图我们看到,与其使用所有的点,可能还不如使用要预测的值的局部的几个训练数据点好。这是局部加权回归的思想,那要如何实现只考虑,或者更准确的说主要考虑局部的训练数据呢?这就是w(i)的任务了。下面给出w(i)的一种数学定义方式,读者可以提供其他的形式,只要能够实现相应的功能就行:

其中x是要预测的值,x(i)是第i个训练数据。分母中的符号’t‘控制训练点随着距离查询点x衰减的速率。越大,衰减的越慢,反之则越快。
从上式可以很明显的看到随着x(i)里x越远,权值w(i)越小。
我们的标题中局部加权(线性)回归。从上面我们已经知道”局部“,”加权“的来源,那这个线性体现在哪呢?我们想一想,从上面的局部加权回归的两步的第1部我们能够看出,在预测x对应的输出时,我们采用的是什么呢?从假设可以看出,采用的仍然是线性回归的方式,只是不像初始的线性回归,局部加权线性回归是在”局部“采用线性回归。从下图可能看到更仔细。

对上图的说明:假如给定x=10,要预测对应的y值,如果又线性拟合的方法的会,拟合得到的是图中的绿线,那么对应的点将在该直线上,但如果是局部加权,也就是只考虑(主要)两条虚线之间,也就是圆圈之内的四个点来线性拟合,那么得到的是那条红线,对应的点在这条红线上相对的y值就是预测值,从直观上来看就可以认为这种预测会更准确。

LWR算法是non-parametric(非参数)学习算法,而线性回归则是一个parametric(参数)学习算法。所谓参数学习算法它有固定的明确的参数,参数一旦确定,就不会改变了,我们不需要在保留训练集中的训练样本。而非参数学习算法,每进行一次预测,就需要重新学习一组是变化的,所以需要一直保留训练样本。也就是说,当训练集的容量较大时,非参数学习算法需要占用更多的存储空间,计算速度也较慢。有得必有失,效果好当然要牺牲一些其他的东西。人不一定什么都擅长,只要有自己的特点就可以了!!

Training Haar Cascades in OpenCV

http://docs.opencv.org/2.4/doc/user_guide/ug_traincascade.html

从这里开始,尝试了一下,但缺失细节,因为只是工具,所以不想全部自己摸索,遂参考下面的网站:

http://www.memememememememe.me/training-haar-cascades/
http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html
http://note.sonots.com/SciSoftware/haartraining.html

然后正在自己尝试做一个分类器,等会更新。

[转]为什么选择archlinux?

一、为什么选择archlinux?

   从06年接触linux开始,我一路使用过:Ubuntu、Ferdoa、Archlinux、Debian、CentOS、DeLi、Puppy、 CDlinux、SliTaz、damnsmall、zenwalk、gentoo。这些不同的发行版各有特点,其中给我留下了深刻印象的有以下几个:

1、Ferdoa
    我从Ferdoa的名字还叫fedora core 6的时候就用这个东西,一直用到fedora14。个人感觉fedora core 6、fedora 8与fedora 12非常经典。这也验证了一个说法,即,在开源软件的领域,偶数版本的总比奇数版的功能更强并更稳定。fedora 7与fedora 9根本就是恶梦,所以吸取教训fedora 13我根本就没用,直接从12跳到了14。应该说,学用fedora,是我走进linux操作系统的第一步,虽然现在不再使用这个系统(因为其个儿头实在 太庞大了些),但我依然对这个系统有好感,因为它敢于坚持一些自己的东西,不像Ubuntu那样“俗媚”。正是因为使用这个系统,让我对linux产生了 兴趣,并开始有计划地一步一步进行学习。

2、DeLi、Puppy与SliTaz
   Ubuntu、Ferdoa、Debian、CentOS这几个系统都太大。Ubuntu过于迁就用户,而且商业化的气息浓厚(与现在国内的“雨林木风” 系统一样),我是浅尝辄止。Debian不错,用于服务器环境有其独到的稳定优势,我也一度将其用作单位的服务器系统,但后来嫌其有些臃肿,而且个别后台 程序不够“透明”,终于还是放弃了使用。弃大系统不用,我的眼光就转向了“小系统”,于是DeLi、Puppy与SliTaz进入了我的眼界。这三个系统 中,Puppy与SliTaz到现在为止,仍然是我的U盘操作系统。其中,Puppy4,以整个系统100MB的大小,一直是我急救U盘的主要操作系统。 比较可惜的是,这两个系统都更接进于“玩具”,不可能用于服务器环境。我个人对DeLi非常有好感,一则,是因为其小,二则,是因为其可以用做服务器!但 非常不幸的是,开发与维护这个系统的团队突然宣布了停止运维,虽然后来好像有人接手,为这个系统另取了一个名字重新开始运维,但我当时已经接触到了 LFS、gentoo与archlinux,对自己手工构建系统产生了兴趣,所以也就不再关注这个系统了。

3、zenwalk
   zenwalk给我留下的印象也很不错。小巧,美观,而且对老硬件的支持非常好。我在学用linux的时候,练手的主要工具,是家里那台赛扬366,内存 64MB的老爷台式机,所以对系统是否支持老硬件非常在意。现在才知道,zenwalk原来也是archlinux的一个分枝。怪不得当初我对区区 400MB左右,却几乎能流畅完成我们日常所想要完成的所有工作的zenwalk有好感!如果不是因为后来知道了archlinux的话,我可能会一直使 用这个操作系统。

4、gentoo
   gentoo令我印象深刻!原因,不在于它多么的好用或者多么的了不起,而在于—-这个系统,是我遇到过的,史上最折磨人的操作系统之一(另外一个折 磨人的,当然是LFS啦!)。我在奔四1.2G、内存256MB的机子上,用了一天两夜(没睡觉!),才将基本系统编译完!换言之,一天两夜,才将这个系 统安装到可以进入命令行的程度!要说安装图型界面,那我只有疯掉!完全没有了动力。安好之后,放置了差不多一个半月,才又下定决心,又用了一天两夜,编译 装上了图型界面与xfce桌面,但从此之后就再也不想用它了—-耗光了我对这个系统的所有激情与热情。但客观地说,这个系统所体现出的理念,可能是所 有操作系统中最为领先的。两个原因:a、一切都对最终用户透明,让人明明白白自己到底在做什么;b、由于可针对硬件进行特殊优化,所以用在服务器环境,估 计没谁会比这个操作系统更强悍!也正是因为这个原因,所以,国内外大型互联网企业都拿gentoo当服务器也就不难理解。

   以上文字中“一路使用过”名单里,我没有写入LFS。这是实话,因为把LFS作为自己的工作环境,我确实没用过,但练手的时候也安装过LFS。要说安装之 后的结论,我只能说,如果不是专业学linux或者不是专业学“嵌入式操作系统”的朋友,那么有两句话一定要放在心上,这两句话就是:珍爱生命,远离 gentoo;珍爱生命,远离LFS。LFS,不是“人”用的系统,如果你想成为操作系统之“神”,那么,不懂LFS,你就永远也只是个凡人。总而言之一 句话,LFS不能用于桌面办公或者服务器环境,虽然上述的操作系统中有好几个都是基于LFS构建而成的,但这个系统确实不是“人”能用的,要命的人,就不 要碰这个系统—-它,会把你的精力耗干!

   如果要打个比方的话,我们不妨可以这样比喻:Ubuntu与Ferdoa是150坪的超豪华精装套房,Ubuntu装修风格媚俗、甜腻;而Ferdoa装 修风格过于现代与超前;Debian与CentOS为实用的大型客房,装修得功能齐备而且适用性广;DeLi与zenwalk为中小型适用房,虽不豪华但 很实用;Puppy、CDlinux、SliTaz、damnsmall这几个,则是外出旅游或者家里房子坏了的时候,偶尔可以暂住一下的小客房。以上几 类都有个特点,那就是房子是现成的,而gentoo,是只有房屋设计图与一大堆水泥、砖块、钢筋之类的东西,你想要房子吗?好的,请你自己按设计图自己修 建!所以gentoo会耗死人!而LFS更离谱,是连房屋设计图也没有,水泥、砖块、钢筋等等也没有,而是给了你一张“房屋建造说明书”,这说明书告诉你 水泥、砖块、钢筋等等建房必需品可以在哪些地方买到,你得自己去找!当然,说明书也简单地告诉了你,房屋的设计图大概框架有哪些,你得自己画!所以LFS 不是普通的“人”能用的东东。至于Archlinux,可以这样看,那就是系统预先提供给用户一套清水房的框架,至于这套房子什么地方是客厅什么地方是卧 室,完全由用户决定,系统提供了各种“屋子”,用户所需要做的事情,就是根据自己的需要,像搭集木一样,用这些“屋子”给拼装成自己需要的套房。而套房的 豪华程度与实用性,则完全由用户自己决定。以上比喻还可以再进一步,例如,我们可以把自己机器的硬件条件,看成是自己兜里的钱—-超豪华套房,不是所 有人都能负担得起的,而且,这套房里不管是否是自己需要的功能,都统统用最好的或者最先进的,这对于兜里钱本来就不多的用户来说,完全就是一种浪费。至于 LFS,如果个是流浪汉,那完全可以按LFS给出的说明书,自己搭一个烂草棚,那也完全足够“容身”之用了。

   本来这部分内容要写的是个人工作站为什么选择archlinux作为操作系统的原因,但上文的写法,其实是对常见linux操作系统的优劣进行了比较。虽 然有些文不对题,但写到这儿,其实为什么我要选用archlinux的原因已经很清楚了。那就是:这个系统,既不像Ubuntu、Ferdoa、 Debian、CentOS等硬把一些不需要的功能塞给你,也不像DeLi、Puppy、SliTaz等个别自己需要的功能又没有;既有gentoo与 LFS那样的“透明”,又不会像gentoo与LFS那样光是安装个系统就会把人给累死—-总之,这个系统在很多问题上,恰恰处于“折中”的地位。权 衡利弊,选用archlinux几乎是必然。

二、个人工作站的功能如何定位?

   在archlinux操作系统下讨论个人工作站的功能,实际意义可能并不大。因为,这个环境下,自己要将自己的系统安装成什么样子,要安装哪些功能,基本 都是自己说了算。每一种功能都有N种软件可实现,或者每一种软件,都有N个大大小小的可替代品。正因为选择的余地大,所以要对个人工作站的功能进行定位, 确实没啥太大意义。反过来,在win系统中,个人工作站所对应的win版本,应该就是windows professional,也就是常说的windows“专业版”。这“专业版”其它的问题不想多说,只说一点:比如,本机上开IIS服务或FTP服务甚 至是共享文件夹,外部客户端联接到本机的个数超过十个,后面的就不再能联上。这并不是系统的问题,而是微软有意对“专业版”作的限制。这种限制当然有道 理:如果“专业版”能联100个外部地址而不断开,可能很多用户在安装服务器的时候也会选用“专业版”了,那显然就是在威胁windows server的地位。正因如此,所以,微软的个人工作站,或曰“专业版”,其实是有很多可见不可见的人为限制的。所以,在win系统下讨论个人工作站,确 实存在功能“定位”的问题,而在linux下,说实话,只要最终用户自己愿意,他想把这机子安成什么样,那确实是他自己的事。

   话虽这么说,但我们还是要对个人工作站的功能定个位,不过我们可以稍定简单一点,那就是:凡是win专业版能实现的所有功能,linux下的个人工作站, 都应该能实现,而且还要功能更强、软件更小巧、系统更轻捷!正因为是如此定义的,所以我在考虑用archlinux建立个人工作站的时候,是尽量避免使用 现成的、成套的所谓套件,所有东西都自己定义,尽量做到美观、小巧而功能完善。

转自:http://blog.sina.com.cn/s/blog_69e5d8400101bqlj.html

Archlinux 的 PCL 安装

一直一直一直没折腾好,之前的电脑是因为不支持sse4的指令集而cmake不过,过了也会失败。

新的电脑装好了archlinux后就开始装pcl,yaourt -S pcl 安装的下载太慢了,就把它的PKGBUILD打开,按照这个来安装(忽然觉得可以直接makepkg,但当时忘了,蠢哭)。

我把pcl-1.7.2.tar.gz下载在~/Downloads,解压之后

yylogo@localhost ~/Downloads % cd pcl-pcl-1.7.2
yylogo@localhost ~/Downloads/pcl-pcl-1.7.2 % mkdir build & cd build
yylogo@localhost ~/Downloads/pcl-pcl-1.7.2/build % cmake ..
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_PREFIX=/usr
-DBUILD_global_tests=OFF
yylogo@localhost ~/Downloads/pcl-pcl-1.7.2/build % make -j2

我遇到了第一个问题是缺少libgl2ps.so

yylogo@localhost ~/Downloads/pcl-pcl-1.7.2/build % sudo pacman -S gl2ps

之后又遇到缺少mpi.so

yylogo@localhost ~/Downloads/pcl-pcl-1.7.2/build % sudo pacman -S openmp openmpi

然后能够make成功,最后执行sudo make -j2 install
好像成功了,赶快试一下效果,用了下面这个例子:
http://pointclouds.org/documentation/tutorials/pcl_visualizer.php#pcl-visualizer
cmake . 成功,make失败,分别安装:
sudo pacman -S unixodbc gdal

可以编译通过,也可以运行了,但是运行会立马挂掉,谷歌之后发现应该是驱动问题,然后把之前安装的闭源驱动删掉,装回了开源驱动。
pacman -S libgl opencl-mesa mesa
#如果之前安装了闭源驱动,会自动提醒冲突问题。

至此,我的PCL就安装好了!
但是也许对你并不适用,因为每台电脑的配置不一样,比如显卡不同,比如CPU 支持的指令集不同,之前的那台旧电脑就是因为不支持intel的SSE 4指令集,所以cmake .失败。

不过我要说的是,遇到问题向上回头看,认真看看,英文不难懂的,然后缺什么装什么就行了,希望你也能装好。

转载请说明来源。

Archlinux的桌面安装篇

新的电脑又重装了一次archlinux,不是第一次装,速度快很多。

首先顺着:https://wiki.archlinux.org/index.php/Beginners’_guide
安装ok之后,接下来:

# 1、安装yaourt
vim /etc/pacman.conf
+ [archlinuxfr]
+ SigLevel = Never
+ Server = http://repo.archlinux.fr/$arch
pacman -S yaourt
# 2、创建用户
useradd -m -g users -s /bin/bash sunny
# 3、语言
vim /etc/locale.gen
+ en_US.UTF-8 UTf-8
+ zh_CN.GBK GBK
+ zh_CN.UTF-8 UTF-8
+ zh_CN GB2312
locale-gen
# 4、安装声卡
pacman -S alsa-utils  #使用alsamixer修改声音(M键取消静音)
# 5、安装X服务和显卡
pacman -S xorg-server xorg-xinit xorg-utils xorg-server-utils mesa
pacman -S xxxxxx #xxxxx为驱动,例如xf86-video-intel 可以输入 lspci | grep -e VGA -e 3D查看显卡,然后在https://wiki.archlinux.org/index.php/Xorg查看对应的驱动
# 6、安装桌面(我使用lxde,可自行修改)
pacman -S lxde
systemctl enable lxdm #设置之后自动启动桌面
#注!自动启动的话,桌面的配置是~/.xprofile,如果是从命令行用startx启动的话,配置文件是~/.xinitrc。
# 6、安装输入法
pcaman -S fcitx fcitx-im fcitx-configtool
pacman -S fcitx-googlepinyin # Google拼音   可以用pacman -Ss fcitx | grep pinyin 查看其他输入法。
#并且在桌面配置文件()中添加
#自动启动的话,桌面的配置是~/.xprofile,如果是从命令行用startx启动的话,配置文件是~/.xinitrc。
vim $HOME/.xprofile
+export GTK_IM_MODULE=fcitx
+export QT_IM_MODULE=fcitx
+export XMODIFIERS=”@im=fcitx”
# 7、浏览器
pacman -S firefox flashplugin
# 8、其他的一些软件
pacman -S openssh openssl git subversion wget axel gvim zsh
# 以下为字体
pacman -S ttf-dejavu adobe-source-han-sans-cn-fonts wqy-microhei wqy-zenhei wqy-bitmapfont
yaourt -S wps-office
# 9、LXDE快捷键启动Lxterminal
vim ~/.config/openbox/lxde-rc.xml
#寻找Keyboard部分,在最后添加
+  <keybind key=”F10″>
+      <action name=”Execute”><command>lxterminal</command></action>
+  </keybind>
#修改配置之后重启或者openbox –reconfigure看到效果。

符合我习惯的系统就基本装好了,之后会写一篇Laravel框架(服务器)安装的和PCL库安装的。

转载请说明来源。

OpenCV 颜色空间笔记

如果imread读进来的是彩色图,则Mat是Vec3b为元素的矩阵,三个分量分别是BGR!注意不是RGB。

另外cvtColor转换成HSV之后,跟理论的H:[0-360], S:[0-1], V:[0-1]不同,OpenCV的范围是[0]:[0-180], [1]:[0-255], [2]:[0-255],所以需要转换一下。

[0]*2 -> H, (double)[1]/255->S, (double)[2]/255->V