LinMinquan's Blog

Experience technology to change life

Python使用OpenCV笔记

环境: Python 2.7.9 (numpy 1.12.1, pip 1.5.6, setuptools 7.0) OpenCV 2.4.13 Windwos 10 64 bit 想要在Python中做视频和图片的合成,简单说就是给视频加个水印。 OpenCV给出的接口是有两种的,一种是旧的接口,叫cv,一种是新的接口,叫cv2。 当然是倾向用新的接口。这两种接口的写法还有点不一样。 想用旧版本的接口得这么写import cv2.cv as cv h264编码的mp4视频在opencv中打不开,原因未知。由于不能像C++那样Debug,所以很容易出现报错的簸并不是真正有问题的代码。比如无法打开h264视频导致后面某一行代码报错。用格式工厂转成avi后可以读。 OpenCV只处理视频的内容,不处理音频的东西。读进来的视频文件直接丢弃了音频的信息。 Read more →

SVN和Git的比较

最近开始学Git,跟以前常用的SVN来做个对比,以便对双方的优缺点了解更多些。 其实Git和SVN还是挺像的,都有提交,合并等操作,看来这是源码管理工具的基本操作。   Git是分布式的,SVN是集中式的,好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在本地提交; Git下载下来后,在本地不必联网就可以看到所有的log,很方便学习,SVN却需要联网; Git鼓励分Branch,而SVN,说实话,我用Branch的次数还挺少的,SVN自带的Branch merge我还真没用过,有merge时用的是Beyond Compare工具合并后再Commit的; Tortoise也有出Git版本,真是好东西; SVN在Commit前,我们都建议是先Update一下,跟本地的代码编译没问题,并确保开发的功能正常后再提交,这样其实挺麻烦的,有好几次同事没有先Updata,就 Commit了,发生了一些错误,耽误了大家时间,Git可能这种情况会少些。  大家也可以搜一搜Git和SVN命令的比对。  下面有一篇文章这样讨论,楼主认为SVN没什么用,我比较认同Ghoststears的观点。 有了GIT,SVN纯粹一垃圾 Ghoststears: 任何事情,归根结底都是人的问题,工具只是工具。SVN 是集中式的,会出现你说的耦合。但从另外一个方面来说,这也要求开发人员代码的规范:不要一个函数干很多事情,不要一个文件写很多个类。另外,将不可运行的代码提交到任何版本控制系统中都是没有意义的。这也就是版本控制的核心思想之一。也就是提交的粒度:原子性。所谓的原子性,也就是完成一件任务,这个任务可以是一个函数声明,也可以是一个函数的实现,亦或是一个子系统。但这个任务的完成的标志就是代码可以运行,不能运行的代码,最多也就是完成了半个任务。这个是不符合版本控制思想的。试想,你 update 到某一个 version 的时候,代码竟然是不能运行的,是何心情???将不能运行的代码提交,完全是开发人员素质或者公司管理流程、机制的问题。另外,很多人都强调:我晚上下班了要在家里干活,不能提交!!!来抨击集中式版本控制工具。且不说对待工作和生活态度。先看看国内的企业,防员工如防贼的多的去了。有多少人能带着笔记本,把公司的源代码签出来呢???版本控制系统中,工具只是其中一环。要结合公司的策略来选用合适的工具。版本控制 != 版本控制工具 !!!= 源代码管理。最后,人各有喜好。上纲上线的,完全没有必要。 Read more →

分享一个挺不错的Git视频教程

http://down.51cto.com/zt/1530  解决了我以前的一些误区: 以为只能用TortoiseSVN来操作SVN,却不知道还有命令行,导致以前做SVN服务端操作时出了一些问题,不知道怎么解决,当时网络上介绍的多是命令的教程; Git与SVN的区别,其实我是为了用用Github.com才写git; 原来也有TortoiseGit这东西。 Read more →

GetLastError()的使用

有次用到CreateBitmap()函数时,返回的HBITMAP一直没有值,不知道问题出在哪,请同事帮忙时,他用到了GetLastError(),紧接着写在CreateBitmap()的后面,拿到的返回值是87,搜了下是参数错误。后来针对地调整了下参数,就可以了。 搜索了下其用法,发现还有FormatMessage()可以配套使用,下面这篇文章写得挺好的。 GetLastError()和FormatMessage()  Read more →

推荐个国外学习编程的好地方Codecademy

www.codecademy.com上面已经有javascritp, python等语言,还挺有意思的,我闲的时候会看下,对于我,主要还是学习英语。页面上大部分都是用英文,所以还是得需要一定的英语基础。 奇怪的是默认中文的课程和英文的课程是不一样的,会少一些。 Read more →

TrackMouseEvent

一个用来判断鼠标是否在其上面或者离开的函数, 在MouseMove中调用,然后以会发送两个自定义消息OnMouseLeave和OnMouseHover, 在MouseMove中可以大概这么写: if (!m_tracking) { TRACKMOUSEEVENT t = { sizeof(TRACKMOUSEEVENT), TME_LEAVE, m_hWnd, }; if (::_TrackMouseEvent(&t)) { //TRACE(“* Mouse enter\n”); m_tracking = true; Invalidate(); } } 添加MouseLeave消息写法: afx_msg LRESULT OnMouseLeave(WPARAM, LPARAM); ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) LRESULT CxSkinButton::OnMouseLeave(WPARAM, LPARAM) { } Read more →

多线程入门

入门起来还真是简单呀。 《VC++深入详解》第15章就有介绍。 难的地方应该在于对资源的互斥方面。 2012.11.18更新 关于线程同步,就是创建一个互斥对象CreateMutex, 然后在线程有可能互斥时调用WaitForSingleObject来达到互斥, 不用的时候及时释放ReleaseMutex。 Read more →

GetRuntimeClass

其实从微软的例子就可以知道它是用来干什么的了 还有一个很有意思的办法可以动态类型识别 Read more →