2012年6月24日星期日

在Qt4.8.0中使用OpenCV 2.3程序异常退出的解决办法

      最近要做一些视频处理方面的内容,在Directshow和OpenCV之间徘徊了一阵后选择了OpenCV,毕竟和Qt一样都是开源跨平台的东东,搭配在一起显得格外和谐。然而按照这篇教程写完后发现那位博主使用的是OpenCV 2.1,而我下载的是OpenCV 2.3,似乎目录结构发生了一些变化,不能按照原来的方法写.pro文件了。琢磨了一番后将文件修改如下:

#-------------------------------------------------
#
# Project created by QtCreator 2012-06-23T15:40:59
#
#-------------------------------------------------
QT       += core gui
TARGET = opencv
TEMPLATE = app

SOURCES += main.cpp\
        mainwindow.cpp
HEADERS  += mainwindow.h
FORMS    += mainwindow.ui
INCLUDEPATH += F:/opencv/build/include
INCLUDEPATH += F:/opencv/build/include/opencv
LIBS += F:\OpenCV2.3\build\x86\mingw\bin\*.dll
      编译没问题,结果运行的时候程序直接退出了,返回值-1073741515。一开始以为是.pro文件的问题,可是无论怎么修改仍然是不能正常运行;更换2.4.1版本的程序库也无济于事。在此期间甚至想放弃Qt转投VS(按照网上的教程VS 2010配置运行成功)。在绝望的时候,突然想会不会是缺什么东西的原因。因此在资源管理器中将所需全部DLL文件复制到exe程序目录下,点击运行后,系统果然提示缺少libstdc++-6.dll这个文件,不仅喜上眉梢,有门!
         然而此时高兴为时太早。将C:\QtSDK\mingw\bin下的libstdc++-6.dll复制过来后却提示“无法定位程序输入点”,看来DLL版本不对!只能上网搜碰运气了!终于,在这里找到了合适的DLL,这回终于正常运行了!
         老规矩,再次放上福利图一枚(看着是不是有点眼熟呢?):



2012年4月5日星期四

++++i和i++++的蛋疼问题

从标题就可以看出这个问题有多蛋疼了。平时谁会这么用啊啊啊啊!!!
不过,既然是个问题,总要有个答案,否则岂不抱憾终生?
通过google,在stackoverflow上寻到了答案:

​T& operator ++(T& a);​     // pre
​T operator ++(T& a, int);​ // post
                          // note the int is solely to distinguish the two
也就是说,i++返回的是变量的值,++i返回的是变量的引用。因此i++++就相当于一个常数++,当然编译是没法通过的,而++++i就可以顺利通过。
但是,根据这个帖子,这两种表达式都会引发“未定义的行为”,因此“Don't do either of them.”
现在没什么遗憾了,这就是“朝闻道,夕死可以”的境界。
最后附上福利美图一枚。



2012年3月24日星期六

U盘FAT32、NTFS格式速度比较

最近用U盘安装Fedora 16,结果安装后无法启动T_T。没辙,U盘还得用啊。可是发现速度降低了不少,原来写入速度可以到5M,现在只有4M左右。想起来格式化时选择的参数是FAT32、块大小4096字节。于是希望缓缓参数来改变速度。于是取不同的分区和块大小分别进行测试。
FAT32分区、块大小4096字节

FAT32分区、块大小8192字节

NTFS分区、块大小16KB


NTFS分区、块大小8192字节
可以看出,块大小为8KB时相比4KB具有很大优势,而块大小为16KB时速度反而下降,而且空间浪费也较大。同时对于8G大小的U盘,有时需要装大于4G的文件,因此选择NTFS格式,块大小为8192字节是最为合适的,可以在速度和空间方面取得平衡。
最后上一张写入速度图:

2012年3月8日星期四

Qt 4.8.0中QAxWidget代码编译不通过的解决办法

    昨天在QtCN上看到Qt的4.8.0版本已发布的消息,决定升级之。QTSDK的升级工具照旧极度不给力(下载太慢了),于是用迅雷以10M/S的速度下载完成后离线安装。安装过程一切正常,但是编译测试以前写的一个QAxWidget项目时出现错误,提示C:\QtSDK\Desktop\Qt\4.8.0\mingw\include\ActiveQt\qaxwidget.h这个文件中所包含的文件不存在,其内容只有一句:#include "../../src/activeqt/container/qaxwidget.h"。其需要在C:\QtSDK\Desktop\Qt\4.8.0\mingw目录下存在src子目录,但是我的Qt安装后并没有这个目录,而4.7.4版本就没有这个问题。

  •    通过SDK升级工具下载安装了QT Sources源码包。此时在QtSDK目录下多出来了一个QtSources文件夹,里面有我们所需的src目录。将其剪切至上述目录后,这回可以编译了。

   但是链接的时候却提示cannot find -lQAxContainerd。大意是在C:\QtSDK\Desktop\Qt\4.8.0\mingw\lib目录下缺少libQAxContainerd.a这个库文件。

  •  因此用QtCreator打开C:\QtSDK\Desktop\Qt\4.8.0\mingw\src\activeqt\activeqt.pro工程,以Debug方式编译后即可生成libQAxContainerd.a库文件(以Release方式生成libQAxContainer.a),复制到C:\QtSDK\Desktop\Qt\4.8.0\mingw\lib,再次编译却出现"Undefiened reference to __SomeFunc@8",这回无解了。

   正在悲伤之际,突然发现了这篇文章,简直如获至宝。大意是说4.8.0有问题,不能使用MingW编译,要使用VS才行。

  • 幸亏安装了VS2010,在左下角点击“计算机”图标后选择VS-调试后再次编译,终于搞定。


   感谢国家,感谢党,感谢谷歌。

2012年3月4日星期日

CUDA 4.1及VS2010 atomicAdd函数未定义的解决办法


测试cuda_by_example的atomicAdd源代码,出现:atomicAdd未定义的错误。这是由于该函数需要显卡支持CUDA 1.1及以上版本。网上流传的方法多是针对CUDA 2.X的,而CUDA 4中似乎将这个标签去掉了,在VS2010中找不到,与现实严重脱节;更有方法要求指定nvcc的参数,这让我们广大VS用户如何吐槽。。。为了节省更多人的时间,故将解决办法贴出。

在VS 2010中如下设置:
项目(不是.cu文件)->属性->CUDA C/C++->Device->Code Generation,点击后选择“编辑”,取消“从父级或项目默认设置继承”前面的勾,在编辑框中输入“compute_11,sm_11”(不包含引号)。一路确定后再编译即可通过。

2012年1月12日星期四

Maryfi使用细则一枚

    得知Maryfi是通过这个帖子。可是那位博主在连接过程中一切顺利,没有遇到任何问题。但是我在使用HTC手机连接的过程中总是卡在“正在获取IP地址”从而无法连接成功。今天终于解决了这个问题。
    安装好Maryfi,插上另一块无线网卡后,点击Start Hotspot(以管理员身份运行)。情况如下图所示,其中Dell 无线 1390 WLAN Mini-Card(以下简称D卡)是笔记本自带无线网卡,Atheros 11G USB Wireless Network Adapter(以下简称A卡)是另外买的一块USB无线网卡,Microsoft Virtual WiFi Miniport Adapter(以下简称M卡)是Win7支持的虚拟无线网卡。
    接下来,共享已有的网络连接。注意此处“家庭网络连接”的地方需要选择M卡,不可以选择A卡。
    下面需要更改A卡和M卡的IP及DNS设置。由于一开始两块网卡使用的是自动获取IP,出现了手机无法正常获取IP的情况,故而尝试使用静态IP,自不过需要将A卡以及M卡设在一个网段。配置如下图所示:
M卡:
A卡:

对于略懂网络知识的同学来说,这里比较容易理解。
OK,大功告成,重新运行Maryfi。在手机端进行相同的配置(只不过IP地址最后一位不能写16了哈),搞定!

Update[2012-10-11]:具体网卡的IP配置可能会有变动。如我在实验室的计算机上按上述配置A卡时会提示:
“警告 - 已计划将多个默认网关用于提供单一网络(例如 Intranet 或 Internet)的冗余。如果这些网关在两个分离且不相互连接的网络上(例如,一个在 Intranet 上,一个在 Internet 上),则它们不能正常工作。是否保存此配置?”

此时只需将A卡设置为自动获取IP和DNS即可。


2012年1月2日星期一

蒙牛事件后,你还能淡定么?


 事件起因:国家质检总局在2011年12月24日公布了一批乳产品抽检结果,其中蒙牛眉山公司生产的一个批次产品被检出了黄曲霉素M1,而且超标140%。
       又是蒙牛!2008年,蒙牛几个批次的奶粉和液态奶产品在国家质检部门的检测中被发现含有“三聚氰胺”。三聚氰胺对肾脏系统和膀胱都有危害,严重的会导致膀胱癌。
       蒙牛对上述两个事件的回应就是:郑重道歉。我们对其的回应是:您请继续。
       老实说,我不同意蒙牛是一家民族企业。哪个国家的民族企业会大言不惭地宣称供港产品质量与出口产品的质量一致(而供应自己国民的产品就是有毒的)?当然,括号中的话蒙牛是不会说的。出了问题,想到的不是怎样赔偿大陆的消费者,而是迫不及待地向其他地区的爷爷们磕头表忠心,通俗的说,这就叫“胳膊肘往外拐”,这是损己利人卑躬屈膝奴颜媚骨的汉奸行为。另外,蒙牛只是一家以盈利为目的的奶制品企业,只是恰好出现在了大陆而已,算不上民族企业。难不成要把中国大陆所有的麦当劳都算作民族企业?真正可以号称“民族企业”而当之无愧的,是那些由个人创办的、仅出现在晚晴以及民国、以振兴中华自强求富为目的企业。蒙牛在那些企业面前,用现在的话说,“简直弱爆了、战斗力只有5”。
       英国有句谚语:"Cheat me once, shame on you; Cheat me twice, shame on me"。大意是说你伤害了我一次,我可以原谅你,这是你的不对,我也要展示我宽大的胸襟;可是如果你再一次的伤害我,那么I'm sorry,这回我不能原谅你了。如果我再原谅你,你还会继续伤害我。这句话的中译版本大约是“一而再,再而三,子子孙孙无穷受伤也”。
      我国现如今实行的是社会主义市场经济体制,我们普通消费者有权决定一家企业的兴衰。当然,如果诸位还是想替蒙牛辩解什么,请便。尽管我也是内蒙人,但我绝不护犊子。如果哪个企业一再的伤害我,那么我用合理合法的手段会让它滚犊子,那就是不买其任何产品。如果蒙牛不倒,那么当年的南京冠生园死的何其之冤?不就是用了点发霉的馅吗?人家又没添三聚氰胺、IGF-1、细菌以及黄曲霉素。不过转念一想,就算是一个蒙牛倒下去,如果不从源头改变我们的监督管理机制,那还会有千千万万个疆牛、藏牛站起来。
      中国人自古以来就有一个令人费解的属性:受。只要整不死我,我还可以继续苟活。除非到万不得已伤口被撒盐,我们是没有反应的,甚至跪求一虐。我想,如果我们仍然对蒙牛的暴行放任横流、听之任之,继续“享用”蒙牛带给我们的“优质高毒”的产品,高呼“每天一斤奶,毒死中国人”,安心做“小受”,那么我们才是鲁迅先生笔下的那些可怜虫。