Opencv移植到arm端常见问题汇总:
- 安装cmake-gui
sudo apt-get install cmake-gui;建议切换到root模式下
cmake-gui
然后点击configure
点击next
注意在target root处填写的是整个交叉编译工具的路径,不只是bin目录
然后点击finish
Configure完成后可以选择将所有库编译成一个,如果需要则将上图蓝色框中的勾选,其他的可以根据个人需求勾选。像WITH_GTK/WITH_TIFF/WITH_QT这些配置的话不建议勾选,因为正常使用的话直接调用即可,如果勾选了,后续配置会比较麻烦
然后点击Generate即可
然后进入选择的构建目录下vi CMakeCache.txt,找到CMAKE_EXE_LINKER_FLAGS这一行,在其后面加上 -lpthread -lrt -ldl(链接属性),如果出现找不到zlib库则可以在之前的Configure后选择勾选正常情况下是可以解决。
make即可(注此处是已经切换了root权限)
如果出现找不到
注意:
1、报错:
undefined reference to `png_init_filter_functions_neon'
交叉编译 opencv3.4.5 ffmpeg libpng
修改
${HOME}/opencv-3.4.5/3rdparty/libpng/pngpriv.h
128 /*# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \*/
129 # if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
Make完成后会在构建目录下生成一个lib目录
如果选择编译成一个库则是如上图所示,如果没有选择则是如下图
Make完成后,可以选这执行make install,也可以不选择,然后将lib内的库文件都复制到开发板的lib目录下。
示例:
Mat srcImage1= imread("background.jpg");//加载图片
Mat rgbImage;
if(!srcImage1.data)
{
cout << "picture error!" << endl;
}
cvtColor(srcImage1,rgbImage,CV_BGR2RGB);//转换颜色空间,QImage是RGB排列,而Mat 是 BGR
QImage img=QImage((const unsigned char *)(rgbImage.data),rgbImage.cols,
rgbImage.rows,rgbImage.cols*rgbImage.channels(),QImage::Format_RGB888);//创建 QImage对象
ui->label->setPixmap(QPixmap(QPixmap::fromImage(img)));
ui->label->resize(ui->label->pixmap()->size());
ui->label->move(0,0);
注意因为是用Qt进行测试,在开发运行时不建议使用
namedWindow("VideoPlay",WINDOW_NORMAL);
imshow("VideoPlay",frame);
这两句代码,因为在原有的window上再创建一个window需要调用gui处理,但大部分开发板配置都比较麻烦而且效率不高,建议直接使用Qt的控件如lable或者OpenGL widget来显示(如果是大型项目建议使用OpenGL widget显示,因为lable显示耗费的是CPU的资源,而OpenGL widget则是交给GPU处理)。
在使用Qt显示图片时,要注意的是,opencv读取的图片是以BGR排列的,而Qt正常显示的话是以RGB显示的,所以需要调用opencv的cvtColor函数对色域进行转换;颜色转换完成后同过Qt的QImage类将图片进行转换QImage::Format_RGB888此处对应的是每个像素格式(位图)。
编译不出错的话则可以正常显示图片