Opencv-2.0.0的ARM移植和使用(Ubuntu10.04 / OK6410开发板 / linux3.01)

288 篇文章 0 订阅
271 篇文章 2 订阅

作者:jasonque

转自:http://blog.csdn.net/jasonque/article/details/8267983


环境:

Ubuntu10.04

OK6410开发板

ARM Linux3.01系统

QT4.7.1

OpenCV-2.0.0

arm-linux-g++ 4.3.2 / arm-linux-gcc 4.3.2

CMake-gui 2.8.0

(建议先参考我的另外一篇博文Ubuntu上安装Opencv-2.0.0)


特别标注:

有些网站转载我的文章不标明出处,并且转载不到位,没有把相应的链接一块转过去,比如说下载链接或相关文献的链接等,导致一些网友阅读和使用出现障碍和知识的不连续,所以在此特别标注:我的这篇文章发表在CSDN博客上,可以到CSDN博客来阅读。


OpenCV2.0.0交叉编译过程:

1、在usr/local新建文件夹

# mkdir opencv

把下载的OpenCV-2.0.0.tar.bz2解压到 usr/local/opencv 目录下

2、然后在usr/local/opencv  新建一个 opencv-arm 文件夹,作为CMake编译arm版本的工作目录

# mkdir opencv-arm

如下图所示:

3、在终端里调出CMake gui界面:

# cmake-gui

按照下图方式选择源码目录和build目录

然后点击Configure按钮,保持generator为Unix Makefiles,选择Specify options for cross-compiling,点击Next

按照如下方式配置:

注:/usr/local/arm/4.3.2 为交叉编译工具 arm-linux-g++/gcc 的所在包含文件夹(在bin文件夹里面)

然后点击 “Finish” 按钮;

修改默认配置,默认安装目录为/usr/local,但我想对它统一归类,所以我在/usr/local/arm/4.3.2/lib目录下新建了一个opencv文件夹,在Cmake-gui里修改CMAKE_INSTALL_PREFIX变量改为/usr/local/arm/4.3.2/lib/opencv/

(另外,如果没有安装tiff图像的支持,请去掉WITH_TIFF)

然后点击Generate按钮生成Makefile;

4、在终端界面中,进入目录/usr/local/opencv/opencv-arm,运行make编译opencv

编译时发现如下错误:
Linking CXX executable ../../bin/opencv_createsamples
../../lib/libcxcore.so: undefined reference to `clock_gettime'
../../lib/libcxcore.so: undefined reference to `pthread_key_create'
../../lib/libcxcore.so: undefined reference to `pthread_getspecific'
../../lib/libcxcore.so: undefined reference to `pthread_setspecific'

原因是cmake不认识我定义的arm-linux系统标记,没有加上库pthread和rt的链接选项

此时需要修改CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread -lrt,如下图:

重新make编译,错误消除,编译成功之后的界面如下:

5、然后运行make install,将opencv生成的库和头文件安装到目录/usr/local/arm/4.3.2/lib/opencv/,结果如下:

6、把这5个 .so 库文件拷贝到ARM板系统中的 /lib 目录下面:(如下是添加之后的截图)

  

7、下来就是编写验证程序了:

首先得确保摄像头在ARM板上的使用是正常的,具体情况请查阅我的另外一篇博文:

摄像头在liunx上的QT显示和OK6410 ARM开发板上的使用

在这篇文章里我曾提到过要使用opencv,但是摄像头出来的是UVC格式,所以我要走一个图像转换流程:UVC转QImage转IplImage;

8、还是那个简单思路:现在ubuntu PC上实现,然后再移植至ARM上;

具体工程代码下载请看附录。

主要涉及opencv的代码如下:

  1. void Widget::paintEvent(QPaintEvent *)  
  2. {  
  3.     uchar * pImgBuf;  
  4.     unsigned int len;  
  5.     camReturn = m_camera->get_frame((void **)&pImgBuf,&len);  
  6.     convert_yuv_to_rgb_buffer(pImgBuf,imgBuf,image_width,image_height);  
  7.     frame->loadFromData((uchar *)imgBuf,/*len*/image_width * image_height * 3 * sizeof(char));  
  8.   
  9.     IplImage* src = QImageToIplImage(frame);  
  10.     if (!src)  
  11.     {  
  12.         printf("img error!");  
  13.         return;  
  14.     }  
  15.   
  16.     //更改图像大小(后期对人脸检测时间控制会有很大帮助)  
  17.     double sizeScale = imgSizeScaleSmall;  
  18.     CvSize img_cvsize;  
  19.     img_cvsize.width = src->width * sizeScale;  
  20.     img_cvsize.height = src->height * sizeScale;  
  21.     IplImage* dst = cvCreateImage(img_cvsize, src->depth, src->nChannels);  
  22.     cvResize(src, dst, CV_INTER_LINEAR);    //opencv函数更改图片大小  
  23.   
  24. //    cvSaveImage("jason.jpg", src);    //ARM对opencv的highgui支持极其差,这个函数不能使用  
  25.   
  26.     //更改图像大小,清晰度会下降  
  27.     sizeScale = imgSizeScaleBig;  
  28.     img_cvsize.width = dst->width * sizeScale;  
  29.     img_cvsize.height = dst->height * sizeScale;  
  30.     IplImage* img = cvCreateImage(img_cvsize, dst->depth, dst->nChannels);  
  31.     cvResize(dst, img, CV_INTER_LINEAR);  
  32.   
  33.     QImage qimage = QImage((uchar *)img->imageData, img->width,img->height, image_Format);  
  34.     //IplImage为BGR格式,QImage为RGB格式,所以要交换B和R通道显示才正常  
  35.     //可以用OpenCV的cvConcertImage函数交换,也可以用QImage的rgbSwapped函数交换;  
  36.     qimage = qimage.rgbSwapped();  
  37.     ui->m_imgLabel->setPixmap(QPixmap::fromImage(qimage));  
  38.     camReturn = m_camera->unget_frame();  
  39.   
  40.     cvReleaseImage(&img);   //释放图片内存  
  41.     cvReleaseImage(&src);  
  42. }  

其中, QImage转IplImage的处理函数如下:(在此感谢此篇博文的帮助:关于QImage和IplImage之间转换的实现

  1. IplImage* Widget::QImageToIplImage(const QImage * qImage)  
  2. {  
  3.     int width = qImage->width();  
  4.     int height = qImage->height();  
  5.     CvSize Size;  
  6.     Size.height = height;  
  7.     Size.width = width;  
  8.     IplImage *IplImageBuffer = cvCreateImage(Size, IPL_DEPTH_8U, 3);  
  9.     for (int y = 0; y < height; ++y)  
  10.     {  
  11.         for (int x = 0; x < width; ++x)  
  12.         {  
  13.             QRgb rgb = qImage->pixel(x, y);  
  14.             cvSet2D(IplImageBuffer, y, x, CV_RGB(qRed(rgb), qGreen(rgb), qBlue(rgb)));  
  15.         }  
  16.     }  
  17.     return IplImageBuffer;  
  18. }  
运行结果如下图所示:



这里得注意一个问题,就是摄像头的名词,我的ubuntu上的名称为:/dev/video0,在ARM上为:/dev/video2;注意修改此处的代码



注:

对于编译时出现的缺少或者不能打开opencv相应的文件或库,原因是你的Makefile里面的环境路径配置有问题,不要把我的工程直接不做修改就拿来编译,会出问题的,(不过编译出来的最终程序也许可以使用)因为我安装的opencv路径可能和你的不一样,具体修改方式请打开Makefile文件,参照原来的内容进行修改。


附录:

源码下载:

1、Opencv2.0在PC Ubuntu上的应用

2、Opencv2.0在ARM Ok6410 linux3.0.1上的应用


参考文献:

【1】mini6410成功移植OPENCV-2.0.0实现人脸检测 http://blog.csdn.net/gfocean/article/details/6341155

【2】关于QImage和IplImage之间转换的实现 http://blog.csdn.net/gfocean/article/details/6440844


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值