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只处理视频的内容,不处理音频的东西。读进来的视频文件直接丢弃了音频的信息。

相关代码见:https://github.com/linmq/Python-OpenCV-Tutorials

SVN和Git的比较

最近开始学Git,跟以前常用的SVN来做个对比,以便对双方的优缺点了解更多些。

其实Git和SVN还是挺像的,都有提交,合并等操作,看来这是源码管理工具的基本操作。

 

1. Git是分布式的,SVN是集中式的,好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在本地提交;

2. Git下载下来后,在本地不必联网就可以看到所有的log,很方便学习,SVN却需要联网;

3. Git鼓励分Branch,而SVN,说实话,我用Branch的次数还挺少的,SVN自带的Branch merge我还真没用过,有merge时用的是Beyond Compare工具合并后再Commit的;

4. Tortoise也有出Git版本,真是好东西;

5. SVN在Commit前,我们都建议是先Update一下,跟本地的代码编译没问题,并确保开发的功能正常后再提交,这样其实挺麻烦的,有好几次同事没有先Updata,就
Commit了,发生了一些错误,耽误了大家时间,Git可能这种情况会少些。

 

大家也可以搜一搜Git和SVN命令的比对。

 

下面有一篇文章这样讨论,楼主认为SVN没什么用,我比较认同Ghoststears的观点。

有了GIT,SVN纯粹一垃圾 

Ghoststears:

任何事情,归根结底都是人的问题,工具只是工具。

SVN 是集中式的,会出现你说的耦合。但从另外一个方面来说,这也要求开发人员代码的规范:不要一个函数干很多事情,不要一个文件写很多个类。

另外,将不可运行的代码提交到任何版本控制系统中都是没有意义的。这也就是版本控制的核心思想之一。也就是提交的粒度:原子性。所谓的原子性,也就是完成一件任务,这个任务可以是一个函数声明,也可以是一个函数的实现,亦或是一个子系统。但这个任务的完成的标志就是代码可以运行,不能运行的代码,最多也就是完成了半个任务。这个是不符合版本控制思想的。试想,你 update 到某一个 version 的时候,代码竟然是不能运行的,是何心情???

将不能运行的代码提交,完全是开发人员素质或者公司管理流程、机制的问题。

另外,很多人都强调:我晚上下班了要在家里干活,不能提交!!!来抨击集中式版本控制工具。且不说对待工作和生活态度。先看看国内的企业,防员工如防贼的多的去了。有多少人能带着笔记本,把公司的源代码签出来呢???

版本控制系统中,工具只是其中一环。要结合公司的策略来选用合适的工具。版本控制 != 版本控制工具 !!!= 源代码管理。

最后,人各有喜好。上纲上线的,完全没有必要。

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

http://down.51cto.com/zt/1530

 

解决了我以前的一些误区:

以为只能用TortoiseSVN来操作SVN,却不知道还有命令行,导致以前做SVN服务端操作时出了一些问题,不知道怎么解决,当时网络上介绍的多是命令的教程;

Git与SVN的区别,其实我是为了用用Github.com才写git;

原来也有TortoiseGit这东西。

我常用的VS快捷键

使用Visual Studio这么多年,现在已经尽量使用快捷键来操作,尽量少用鼠标,提高效率。

我都有安装Visual AssistX工具,有一些快捷键是VA的,如下:
Ctrl+F 当前页面搜索
Ctrl+Shift+F 整个工程搜索
Ctrl+I 直接在页面快速搜索
F3: 查找下一个
Shift+F3: 查找上一个
在当前文件中搜索某个函数,可以
Alt+M 跳到VA的工具栏直接搜索所有的函数
Ctrl+M,Ctrl+L 把所有的函数都收起来,这样子也比较容易找到要找的函数
Alt+O,跳到本文件对应的.h或.cpp文件
Alt+G,光标在某个函数,跳到该函数的声明或定义,比F12好用
Alt+←,将光标移到前一个光标位置
Ctrl+Tab,快速按一下:切换到前一个文件;按住Ctrl,多次按Tab:逐个切换文件
Ctrl+W,选中当前变量或函数
CTRL + U转小写
CTRL + SHIFT + U转大写
Ctrl+F4,关闭文件
F4,编译后如果有错误,跳到第一个错误
Alt+F10,在调试时,应用修改

GetLastError()的使用

有次用到CreateBitmap()函数时,返回的HBITMAP一直没有值,不知道问题出在哪,请同事帮忙时,他用到了GetLastError(),紧接着写在CreateBitmap()的后面,拿到的返回值是87,搜了下是参数错误。后来针对地调整了下参数,就可以了。

搜索了下其用法,发现还有FormatMessage()可以配套使用,下面这篇文章写得挺好的。
GetLastError()和FormatMessage() 

TrackMouseEvent

一个用来判断鼠标是否在其上面或者离开的函数,
在MouseMove中调用,然后以会发送两个自定义消息OnMouseLeave和OnMouseHover,
在MouseMove中可以大概这么写:
if (!m_tracking)
{
TRACKMOUSEEVENT t = {
sizeof(TRACKMOUSEEVENT),
TME_LEAVE,
m_hWnd,
0
};
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)
{

}

多线程入门

入门起来还真是简单呀。
《VC++深入详解》第15章就有介绍。
难的地方应该在于对资源的互斥方面。

2012.11.18更新
关于线程同步,就是创建一个互斥对象CreateMutex,
然后在线程有可能互斥时调用WaitForSingleObject来达到互斥,
不用的时候及时释放ReleaseMutex。