Posted on 24-08-2011
Filed Under (技术) by waterlin

今天为这件事情折腾了一天!

我用 Java 写的中间件,会根据用户的需要,启动一个子进程,这个进程是用 C++ 写的,正好用到了 Log4Cxx 来记录日志以便分析。这个进程,单独从控制终端运行,没有任何问题;但是一旦用 Java 启动子进程的方式来启动,则这个子进程刚一启动就阻塞不动了,然后大概等上几十分钟到两个小时不等,该子进程则又能顺利执行下去。

第一次碰到这样的问题,很怪异,经过反复测试及万能的 Google 帮忙,找到Java调用外部程序挂起原因,Log4Cxx 原来是罪魁祸首,因为它重定向了大量的日志信息到控制台,由于 Java 进程没有清空程序写到缓冲区的内容,结果导致程序一直在等待。

解决这个问题有两个办法:

  1. 按上文中的说法,在遇到 Java 启动外部程序而导致线程阻塞的时候,可以考虑使用两个线程来同时清空 process 获取的两个输入流;
  2. 直接把 Log4Cxx 重定向到控制台的日志消息给取消掉,这个可以通过 Log4Cxx 的配置文件来实现

问题搞定了,世界又变得很美好了!

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

在写客户端的时候,经常要传输一些文件,有一些服务器就是用 FTP 来搭建的,这个时候,如何用客户端来发起 FTP 网络连接呢?

如果是用 MFC 来发起 FTP 文件传输请求,和使用 MFC 来发起 HTTP 请求类似,非常简单。理论基础可以仔细阅读 MSDN 上的官方文档 Steps in a Typical FTP Client Application浏忙绪绪在这里,就贴上我自己写的代码,与大家分享一下。

样例代码如下:

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

Emgu CV 是 OpenCV 跨平台的 C# 封装包,主要是为了方便在 C# 里使用 OpenCV 的库函数,下载和安装都很简单,新建一个 C# 控制窗口程序后,Hello World 例子代码如下:

这里需要注意的是,如果用 Visual Studio 2008 来调试上面的代码,则记得要把 OpenCV 相关的动态链接库放到你测试工程的这个目录里:

否则在跑到下面这句代码

的时候,就会弹出一个莫名其妙的出错框,提示如下错误:

看来,C#调试时的程序动态链接库读取位置,还比较特殊呀~~

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

OpenCV2.1 生成视频选择编码的 bug

最近使用 OpenCV2.1 来生成视频,在 Windows 下碰到这样的问题:不管我用什么样的编码,都没有办法直接生成视频,并且会导致程序崩溃。代码如下:

但是,如果我把编码换上 -1 选项来手工选取视频格式,则能顺利生成视频。代码如下:

这个应该是 OpenCV2.1 里的一个 Bug,换成 OpenCV2.2 就没有这个问题了。

OpenCV2.2 的 Visual Studio 2008 问题

官方的 OpenCV2.2 是在 Visual Studio 2010 下编译的二进制包,所以,当你把 OpenCV2.2 嵌入到 Visual Studio 2008 里,可以正常编译相关的代码,但是一运行,一定会提示找不到动态链接库 msvcp100d.dll 或是 msvcr100d.dll

这个时候,你可以把这两个 Visual Studio 2010 的动态链接库拷贝到编译好的可执行文件目录里。但是,最好的方式,是你在 Visual Studio 2008 里重新编译一下 OpenCV2.2

OpenCV 读取视频帧与 DirectShow 读取视频的步调不一致

有一些视频,我用 OpenCV 跳转到指定的时间,和用 DirectShow 跳转到视频指定的时间,理论上来说,应该是一样的。可是,在我这里,偏偏就出现了跳转视频位置不同的情况。而且,原始视频越长,这种误差越大。

是什么原因呢?

仔细研究了一下,我用 OpenCV 读取参数,会显示是 29 帧/秒,大约有 276168 帧;但是用 DirectShow 解码后显示为 30 帧/秒,计算后约为 268946 帧。

解码后的度量时间标准不同,也就导致了上述误差。但是,真实的原因是什么呢?

(0) Comments    Read More