Posted on 09-12-2017
Filed Under (技术) by waterlin

Windows 下用 Python3 和 OpenCV3.3.1 来写算法,在生成 H.264 的视频的时候,碰到提示这样一个错误:

两个解决办法:

1. 修改生成视频的编码器类型,不要用 acv1 编码器,比如说可以试试 XVID 编码器。

2. 去 openh264 下载对应的版本,放到 PATH 目录里,这样让 python 能够正常加载这个动态库。

比如在我这里,就去下载 openh264-1.6.0-win64msvc.dll.bz2 这个版本,然后放到一个 PATH 包含的目录里,让这个库能正常加载。

如果你成功加载了这个 openh264 库后,即可在终端输出里看到这样的一句话:

这样就能在 Windows 下用 Python3 + OpenCV3.3.1 来生成视频了。

(0) Comments    Read More   
Posted on 09-12-2017
Filed Under (技术) by waterlin

在 Windows 下,如果需要使用 OpenCV、Dlib、Python3 来进行一些算法开发,整个环境配置起来还是有点麻烦的,摸索了一下,记录一下安装步骤。

1. 安装 cmake

直接从官方下载一个版本安装即可。

2. 配置 Boost 开发环境

Boost 的官网下载一个你需要的版本号,对于我这次来说,我下载的是 1.63 版本(需要和第3步里的 Boost Python接口版本号对应上),具体的安装方法可以参看这个教程。简单来说,就是在 Boost 的解压目录里,用下面的命令来编译 Boost 库:

安装好以后,需要设置对应的 Boost 的 Windows 环境变量:

3. 安装 Python 3.6 版本以及对应的 Numpy、SciPy、OpenCV 等工具库

对于 Windows 下,安装 Python3.6 很简单,从官方下载安装包安装即可。但是对于 Python 依赖的工具包,有的时候,安装起来就会比较麻烦。对于 AI 或是科学计算经常使用的库,比如说 numpy、SciPy 等,最好通过 Unofficial Windows Binaries for Python Extension Packages 下载对应的包来安装。

比如,对于我们的 Windows 和 Python3.6 版本来说,我就选用对应的 64 位版本来进行安装:

注意看一下 Boost 的版本号需要和第二步里的版本号对应上。

安装的命令很简单,比如说对于 numpy 来说,使用这个命令就可以了:

3. 编译和安装 dlib

下载 dlib-19.7 源代码包解压,再从 cmd 进去,如果上述配置正确的话,应该可以用下面的命令来进行自动编译和安装:

在这里的时候,我碰到一个问题,因为我的 Windows 是中文版本的系统,所以在运行上述命令的时候,提示了这么一个错误:

这是因为中文操作系统中 cmd 编码为 GBK 而不是 UTF-8 ,从而导致 Python3 编码错误的问题,安装前先修改 setup.py 文件,把第 274行的 sys.stdout.encoding 改成 GBK:

4. 安装 dlib Python 扩展包

最后,上述步骤完成后,再用

来安装 dlib。

上述步骤如果一切正确,现在就可以在 Windows 上正常的使用 dlib 库来做算法分析了。

(0) Comments    Read More   
Posted on 09-12-2017
Filed Under (技术) by waterlin

Boost 的官网下载一个你需要的版本号,按下面的步骤即可在 Windows 下安装编译 Boost 库:

1. 解压文件夹到指定目录;

2. 选择你想使用的 Visual Studio 版本来编译 Boost,如果机器上有多个 Visual Studio 版本,就从指定 Visual Studio 版本的 command prompt 进入 boost 的解压目录;

3. 运行 Boost 代码目录下的 bootstrap.bat 脚本;

4. 再跑下面的脚本来进行编译:

或是想用更多的参数可以像这样:

注意,上面的 address-model=64 是表示编码64位的,所以,如果要编译32位的,可以用 address-model=32。更多有关 b2 的命令行参数查阅这里

5. 最后编译好的东西,就放在 stage 里,一般来说用静态库就可以了。

6. 如果需要针对多个VS版本来进行编译,可以重新上述步骤,选择不同的平台,就会把库都编到同一个安装目录了。

注意,不管是对 32 位还是 64 位来编译,生成的库文件名,都是相同的,所以需要在编译完 32 位后,拷贝一份数据出来,再重新编译一份。

(0) Comments    Read More   
Posted on 15-02-2017
Filed Under (技术) by waterlin

Visual Studio 2015 可以作为Linux开发和调试的利器了,很好用,按这篇文章配好环境就可以开始愉快的编码了。

但是如果在这里用 CMake 来构建工程,可能要注意一下:

1. 需要把 cmake 工程文件设置为自动拷贝到服务器

vc-linux-cmake-1.png

2. 需要配置一个编译命令和路径,因为 VS 默认的工作目录和我们在Linux上时是不一样的

比如,针对 Debug 模式可以是这样的:

vs-linux-cmake-2.png

上面红线的内容是类似这样的:

针对 Release 模式是这样的:

vc-linux-cmake-3.png

上面红线的内容是类似这样的:

这样就可以用 cmake 来构建工程了,如果别人不用 Visual Studio,也同样可以用原来的 cmake 方法直接上 Linux 服务器去手动编译。

(0) Comments    Read More   
Posted on 06-01-2015
Filed Under (技术) by waterlin

在我的电脑上,如果开了麦克风增强,会导致自己用耳机听音乐的时候,有一股浓浓的沙沙声。如果使用 YY 或是其它语音通讯工具,对方也会听到一股重重的沙沙声。这个声音就和电流声很像。

如果碰到这个现象,只需要按下述步骤把麦克风增强这个选项关掉:

  1. 在右下角的声音标志上点右键,打开“录音设备”

    ./images/win7-audio-sasa-1.png

  2. 在“录音”标签页上的麦克风选项上点击“属性”,打开属性对话框

    ./images/win7-audio-sasa-2.png

  3. 在“麦克风属性”对话框上,点击级别标签页,把“麦克风增强”设置为 0 即可。

    ./images/win7-audio-sasa-3.png

(0) Comments    Read More   
Posted on 04-01-2015
Filed Under (技术) by waterlin

最近在使用定时器的时候,被一个小细节坑了,偶尔导致 coredump,费了好大的力气才找到原因,现在整理一下备忘。

我采用了如下方式来生成了定时器:

然后,我就不断地调用上面的代码来生成定时器,并干相应的的事情,比如说视频帧的刷新等操作。但是,我犯了一个错误,在我需要结束定时操作后,我采用了如下的方式来结束定时器:

就是因为最后一个参数的原因,偶尔会出现崩溃:即定时器并没有因为这一行代码而完全销毁,从而导致这个类在销毁后,定时器依然触发了回调信息。

要解决这个问题很简单,只需要把上述代码里的 NULL 参数修改为 INVALID_HANDLE_VALUE 即可:

看看微软官方文档对这两个参数区别的说明:

If this parameter is INVALID_HANDLE_VALUE, the function waits for any running timer callback functions to complete before returning.

If this parameter is NULL, the function marks the timer for deletion and returns immediately. If the timer has already expired, the timer callback function will run to completion. However, there is no notification sent when the timer callback function has completed. Most callers should not use this option, and should wait for running timer callback functions to complete so they can perform any needed cleanup.

即,如果使用 INVALID_HANDLE_VALUE 这个参数,则 DeleteTimerQueueTimer 会等待定时器销毁以及回调函数结束后才返回;如果使用 NULL 则把定时器立即标记为销毁,但是实际上的运行并不受控制,如果有定时器正处在回调函数里并正在执行,有可能导致异常情况。

我的崩溃就是由于这个参数引起的,不容易出现,很不好找原因。

(1) Comment    Read More   
Posted on 24-10-2014
Filed Under (技术) by waterlin

最近在产品开发中,有用到 QProcess 启动一个进程,并且与之通信。产品开发完了提交给测试组测试,发现产品的内存会不断地增长,但是这个增长速度十分缓慢,大概 12 小时 20M 左右。

怎么看都不像是常规的内存泄漏!

然后是各种找原因,先是把产品中有关视频展示及渲染的部分关掉进行测试,然后逐步把一些其它部分屏蔽掉,最后关得只剩下 socket 这个环节了,可是内存还在缓慢增长。Qt 的 socket 很靠谱啊?找来找去,终于觉得是 QProcess 惹的祸了。仔细地读了读文档,看到下面这一句话:

void QProcess::closeReadChannel ( ProcessChannel channel )
Closes the read channel channel. After calling this function, QProcess will no longer receive data on the channel. Any data that has already been received is still available for reading.
Call this function to save memory, if you are not interested in the output of the process.

其实 QProcess 是会把你启动进程的标准输出重定向到你的程序里来,从而占用你程序的内存。原来我这个缓慢增长就是由于 QProcess 启动进程后的 stdout 输出没有及时清理导致的。

如果不需要 QProcess 启动进程的标准输出,只需要在使用 QProcess 启动进程前调用 closeReadChannel 这个函数关闭输出即可。如果需要 QProcess 导过来的进程输出,则只需要在有输出数据的时候,读取干净即可。

(0) Comments    Read More   
Posted on 21-08-2014
Filed Under (技术) by waterlin

最近在 PC 上需要生成一个二维码图片,准备使用 libqrencode 这个 QR 二维码生成库。Windows 下有一个它的移植版本 qrencode-win32,除了有源代码以外,还有一个 Windows 下的应用程序,可以直接用来生成 QR 二维码。

我使用的是 libqrencode 3.4.2 版本,对应于 Windows 下的版本是使用 VC8 来构建工程的,而我本地只有 VC9 的版本,我升级工程后进行编译,提示如下错误:

这是因为在 VC9 CRT 里已经定义了 vsnprintf 这个函数,而在 VC8 里却没有,所以在很多 VC8 或更早的代码里,会添加类似下面的定义:

对于 libqrencode 来说,也是这个问题,只需要把 config.h 里的这一句代码注释掉即可。

如果还需要在 VC8 和 VC9 里使用,则可以使用下面的方式来灵活定制:

(0) Comments    Read More   
Posted on 20-08-2014
Filed Under (技术) by waterlin

Visual C++ 2008 SP1 compiler error C1859

有一些工程,在编译好后再重新编译,会提示类似如下错误(Windows7下容易出现):

这个就是 Visual C++ 2008 SP1 compiler error C1859 的问题,解决办法就是安装一个补丁包

除了安装上述安装包以后,还可以使用如下方式来修复该问题:

  • Disable /analyze (if enabled).
  • Invoke a clean build.
  • Reboot your machine.
  • Disable PCH files.

使用 std::copy 时的 C4996 警告

Visual C++ 2008 里如果把警告当成错误处理时进行编译,下面这个警告就会被当成错误,很扎眼,而你,则一定需要解决这个问题。

这是在使用 Visual C++ 自带的标准库时,Visual C++ 的编译器会加强检查,标准库里的一些方法会认为在使用上是不安全的。Visual C++ 对此提出警告、不建议使用这些函数,并且 Windows 提供了一些其它以 _s 结尾的函数用来替代这些方法。std::copy 就是这个现象的重灾区。

如果是你自己的代码碰到这个问题,那很好解决,你只需要把这些函数替换成 Windows 提供的更安全的函数即可。但是,如果是你引用的第三方库的代码问题,而你又在 Visual Studio 里把安全级别设置成不允许有警告,这个时候,就只能通过定义一个 _SCL_SECURE_NO_WARNINGS 宏来解决此问题。

(0) Comments    Read More   
Posted on 03-03-2014
Filed Under (技术) by waterlin

最近家里的电脑换了一个 Windows7 系统,再安装 Visual Studio2008 & sp1,以及 Qt 4.7.1 等一系列的开发工具后,以前能正常编译的代码,现在一编译就提示说 mt.exe 已停止工作错误。

如果单纯地把 Embeded Manifest 关闭,虽然可以正确地编译生成可执行文件,但是在你需要执行该可执行文件的地方,却需要手动拷贝与之相关的动态链接库,相当麻烦,所以,最好还是保证 mt.exe 能正常工作。

之前能正常编译的东西无法编译了,只能说明是系统更新造成的影响。仔细查了一下,原来应该是系统自带的 Microsoft .NET Framework 4 Client Profile 这个程序带来的影响,把这个程序卸载掉后, mt.exe 与 Qt 就可以一起正常工作了。

Qt 为啥会和 Microsoft .NET Framework 4 Client Profile 有冲突?

(0) Comments    Read More