机器人工程师也要懂 OpenCV
新浪微博上看到:
@存在如棘:最近委托供应商研发一台设备,用到PR修正机械定位精度,那软件工程师竟只会用康奈视的相机,我们提供的德国Basler的不会用。跟他说OpenCV,连听都没听过。机器视觉这领域涉足人还太少啊。
机器人工程师还是有必要涉足 OpenCV 领域的。于是 LT 入手了这本书《OpenCV2计算机视觉编程手册》,是《OpenCV 2 Computer Vision Application Programming Cookbook》的国内翻译版。
此书有别于其他的书的是介绍的是 opencv2 的内容,且是采用 C++ 的语言和 Qt 的开发环境。建议使用中文版快速入门,然后再对照英文版学习,毕竟英文版原汁原味。
OpenCV 2.4.3 和 VS2010
写这篇文章时,http://www.opencv.org.cn 最新的 OpenCV 是2.4.4,为了求稳,降一个版本,我下载了 2.4.3。发现和书中有些不同,2.4.x的 OpenCV 把头文件、库文件放在了build目录下,和书本里的 2.2 不同,这点要注意!按照书上 1.3 节的介绍,在 VS2010 里初步成功运行了一个demo! 在这个 demo 中,作者给出的方案是另建一个“属性表”,以便后面的项目重复使用配置,这个比网上人云亦云地直接修改项目属性好多了。
#include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> using namespace cv; int main(){ //read a image Mat image= imread("lena.jpg"); // avoid mem error if (image.empty()){ namedWindow("can not find image : lena.jpg"); waitKey(); return -1; } //creat image windows named "My Image" namedWindow("My Image"); //show the image on window imshow("My Image",image); //wait key for 5000ms waitKey(5000); return 1; }
OpenCV 2.4.3 和 Qt 5.1.0
随后又尝试了 Qt 环境的 demo,采用的是Qt 自带的原生 IDE 环境 Qt Creator。不过发现作者有些不负责了,关于 .pro 的配置描写的很笼统,让新手很容易迷糊。我参考了网上的资料,补充上我的 .pro 配置 ( 要根据 OpenCV 版本来配置哦,不要死搬)。
INCLUDEPATH += d:\opencv\build\include\ INCLUDEPATH += d:\opencv\build\include\opencv\ INCLUDEPATH += d:\opencv\build\include\opencv2\ CONFIG(debug,debug|release) { LIBS += -Ld:\opencv\build\x86\vc10\lib \ -lopencv_core243d \ -lopencv_highgui243d \ -lopencv_imgproc243d \ -lopencv_features2d243d \ -lopencv_calib3d243d } else { LIBS += -Ld:\opencv\build\x86\vc10\lib \ -lopencv_core243 \ -lopencv_highgui243 \ -lopencv_imgproc243 \ -lopencv_features2d243 \ -lopencv_calib3d243 }
.pro 文件编辑后,要运行 qmake,生成 makefile,然后才可以顺利 build 成 exe文件。
#include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> using namespace cv; int main(){ //read a image Mat image= imread("img.jpg"); // avoid mem error if (image.empty()){ namedWindow("can not find image : img.jpg"); waitKey(5000); return -1; } //creat image windows named "My Image" namedWindow("My Image"); //show the image on window imshow("My Image",image); //wait key for 5000ms waitKey(5000); return 1; }
对了,图片放在哪里呢?怎么找不到呢?其实放在项目的 makefile 同一目录下就好了,如 build-*目录内。
如果需要使用调试器,而 Qt Creator 提示调试器没有配置,可以去下载一个 Debugging Tools for Windows (32位的:文件名 dbg_x86_6.11.1.404.msi ),安装后在 Qt Creator 里面“自动检测”到即可。粗看本书,发觉作者是打算以后的例子都用 Qt Creator 来演示,所以还是把 Qt Creator 配置好为先。
Qt Creator 与 Git
Qt Creator 中使用版本控制工具很方便,比如 Git,按照前面《Windows 环境下 Git 完美使用设置小结》介绍安装设置完 Git,只需要把 Git 的 bin 目录路径填入到 Qt Creator 的 Tool -> Option -> Version Control -> Git 选项页的 PATH 里面即可识别。然后就可以在 Tool 里面调用。
OpenCV 版本问题引起的麻烦
本书作者写书时,用 OpenCV2.2 做的例子,但在IT界,明显是天上一天地上十年的趋势,如今已是 OpenCV2.4了,函数有可能被取消或者发生改变。我倒是觉得译者在翻译时,可以在书中指出这些变化,不失为一种有价值的做法。
Page25: QT5取消了 QString 的 toAscii() 方法,改用 toLatin1() Page28: cv::cvtColor() 函数需要头文件gpu.hppimgproc.hpp (20130805更正)
至此,LT 完成了本书第一章的实践练习 (源码附上备忘 OpenCVProjects_chapter01)。发觉 Qt 可以作为除了 MFC外,另一个值得花功夫研究的框架,它的跨平台特性,让人兴奋。
扩展阅读:
- 《OpenCV 2 Computer Vision Application Programming Cookbook》
http://book.douban.com/subject/6521022/
- VC 2010 Express下安装OpenCV2.4.3
http://www.opencv.org.cn/index.php/VC_2010_Express下安装OpenCV2.4.3
- QT中PRO文件写法的详细介绍
http://blog.chinaunix.net/uid-23592843-id-2495471.html
- Qt5 minGW undefined reference to…错误
http://blog.csdn.net/liyanfasd/article/details/9475637
- 从Qt4.x升级至Qt5工程代码需做的改变
http://blog.csdn.net/liyanfasd/article/details/9534801
- opencv2 中文参考手册目
http://www.opencvchina.com/thread-1758-1-1.html
- ABB机器人与OPENCV @肖辉
http://blog.sina.com.cn/s/blog_6262b24e0101nsyw.html
关键字:OpenCV, OpenCV2, Qt5, VS2010, Qt5.1.0, OpenCV2.4.6, Qt Creator
请问你说:pro 文件编辑后,要运行qmake,生成makefile,然后才可以build成exe文件。 如何运行qmake啊?
项目名字,点右键,执行qmake
或者 构建 菜单下面也有
求联系 我的qq是62382131
623852131 写错啦
楼主,我的qt是5.1 ,运行显示我没有构建调试器,这个怎么怎么回事的啊?我的版本是Qt 5.1.0 for Windows 32-bit (VS 2012, 511 MB) (Info) 是不是下载错啦?请教
调试器安装这个即可 Debugging Tools for Windows (文件名 dbg_x86_6.11.1.404.msi )
安装了,依然没有效果的啊,,,,
看看这个 http://bbs.csdn.net/topics/390329910
刚刚看了,我的qt选项里面没有Kits选项卡,我直接安装了Debugging Tools for Windows (文件名 dbg_x86_6.11.1.404.msi ),但是还是不行的,请教的啊
看本帖我新加的图片
我的里面没你那个选项 这个是什么回事的啊
请问 楼主qt5.1是哪个版本的啊?
版本应该区别不大。我因为用的VS2010,所以我用的版本是 qt-windows-opensource-5.1.0-msvc2010-x86-offline
现在运行没有错误了 但是一运行就无法显示图片,出现如下的代码;Desktop_Qt_5_1_0_MSVC2010_32bit-Debug\debug\heool.exe…
The program has unexpectedly finished.
D:\Projects\Qt\build-heool-Desktop_Qt_5_1_0_MSVC2010_32bit-Debug\debug\heool.exe exited with code -1073741515 请教 这个是怎么回事的啊, 我就是照你上面配置的啊
善用搜索: http://harryhuang8.blog.163.com/blog/static/1635961772010926112719121/
我已经将C:\Qt\Qt5.1.0\Tools\QtCreator\bin写到path里面了 但是 哈似乎那个问题的
请问你这openv库要编译的吗,刚刚针对那出现的问题,网上说要编译的
不需要。你装的opencv版本和.pro里面的lib版本对应么?
对应的啊
你看 这个是.pro里面的代码:
INCLUDEPATH += d:\opencv\build\include\
INCLUDEPATH += d:\opencv\build\include\opencv\
INCLUDEPATH += d:\opencv\build\include\opencv2\
CONFIG(debug,debug|release) {
LIBS += -Ld:\opencv\build\x86\vc10\lib \
-lopencv_core246d \
-lopencv_highgui246d \
-lopencv_imgproc246d \
-lopencv_features2d246d \
-lopencv_calib3d246d
} else {
LIBS += -Ld:\opencv\build\x86\vc10\lib \
-lopencv_core246 \
-lopencv_highgui246 \
-lopencv_imgproc246 \
-lopencv_features2d246 \
-lopencv_calib3d246
}
我还把bin写到path里面了,C:\Qt\Qt5.1.0\5.1.0\msvc2010\bin,这样对吗
可以
你好,我每次执行总是显示不能找到文件错误。例如,“:-1: error: cannot find -lopencv_core249d”。
已经核查pro文件,与实际版本对应。已经执行了qmake,已经将bin设置系统路径path。
检查库文件的路径对不对?比如C盘和D盘区别?
我的QT5.5 qmake后运行,提示错误如:
D:\OpenCV\opencv_project\QT_Develop\test1\opencv_qt_test1\main.cpp:11: error: undefined reference to `cv::imread(std::string const&, int)’
但是我的lib是对应加载好的。而且我的opencv在VS2013上市可以用的。
请问这是为什么?
头文件?
我的头文件和博主的是一样的。我想应该还是Qt配置的问题,但是不知道缺少了什么?
你好,我的怎么会出现这样的错误,请教下,谢谢了
debug/main.o: In function `main’:
C:\Users\Administrator.AZU9F7UB7BS30XB\Desktop\test\build-test2-Desktop_Qt_5_5_1_MinGW_32bit-Debug/../test2/main.cpp:21: undefined reference to `cv::imread(std::string const&, int)’
debug/main.o: In function `ZN2cv3MatD1Ev’:
D:/Program Files/opencv/build/include/opencv2/core/mat.hpp:278: undefined reference to `cv::fastFree(void*)’
debug/main.o: In function `ZN2cv3Mat7releaseEv’:
D:/Program Files/opencv/build/include/opencv2/core/mat.hpp:367: undefined reference to `cv::Mat::deallocate()’
collect2.exe: error: ld returned 1 exit status
Makefile.Debug:77: recipe for target ‘bin\test2.exe’ failed
mingw32-make[1]: *** [bin\test2.exe] Error 1
mingw32-make: *** [debug] Error 2