相关链接:
opencv-3.4.1-x86编译安装 – 超详细
ubuntu:ubuntu1604
arm-linux-gcc:arm-cortex_a9-linux-gnueabi (version 4.7.4)
arm开发板:S5P6818
opencv源码:opencv-3.4.1
opencv_contrib扩展包:opencv_contrib-3.4.1
makefile生成:cmake+cmake-gui
#apt-get install lib32z1
#apt-get install cmake cmake-qt-gui build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libtiff5-dev libswscale-dev libjasper-dev
官网处获取源码:速度比较慢,没梯可能不好办。
https://github.com/opencv
选择对应版本,下载下来
也可以下载我下载好的,5积分(放的时候是5):
https://download.csdn.net/download/qq_44503344/12666252
#mkdir /opt/wkspace/opencv_arm
#cd /opt/wkspace/opencv_arm
#cp ?/opencv-3.4.1.zip
#cp ?/opencv_contrib-3.4.1.zip .
#unzip opencv-3.4.1.zip
#unzip opencv_contrib-3.4.1.zip
交叉编译时,要先编译源码包再编译扩展包
#cd opencv-3.4.1
#mkdir build
#cd build
#cmake-gui ..
**1)点击configure **
2)配置编译器 关键,搞错随随便便重新经历make
根据博文:https://blog.csdn.net/u013752202/article/details/47358389/的解释:Operating System只能写Linux,经过测试写arm-linux(实际上只是第一次以为没问题emmm)的话编译出来的库不完整,无法运行。
3)勾选 jpeg和png库
4)修改安装目录 记得要改哈。。免得安装到usr/local里跟x86版本搞混了
我安装在 /opt/wkspace/opencv_arm/output
5)configure && Generate生成makefile
make时长可能有点久,我机器大概花了7个小时。
问题1
/opt/wkspace/opencv_arm/opencv-3.4.1/3rdparty/protobuf/src/google/protobuf/stubs/common.cc:52:2: error: #error "No suitable threading library available."
原因:没有连接到pthread库
解决方法:
1)修改common.cc文件
在文件最上方加入语句
#define HAVE_PTHREAD
2)修改CMakeCache.txt
修改(可以在vim中用’/'来定位字串):
//Flags used by the linker.
CMAKE_EXE_LINKER_FLAGS:STRING=
为:
//Flags used by the linker.
CMAKE_EXE_LINKER_FLAGS:STRING= -lpthread -lrt
重新make解决
问题2
../../lib/libopencv_core.so: undefined reference to `dlopen'
../../lib/libopencv_core.so: undefined reference to `dlclose'
../../lib/libopencv_core.so: undefined reference to `dlsym'
collect2: error: ld returned 1 exit status
modules/core/CMakeFiles/opencv_test_core.dir/build.make:880: recipe for target 'bin/opencv_test_core' failed
原因:dl库未链接
解决方法:修改CMakeCache.txt
修改(可以在vim中用’/'来定位字串):
//Flags used by the linker.
CMAKE_EXE_LINKER_FLAGS:STRING= -lpthread -lrt -ldl
重新make解决
#cd opencv-3.4.1
#mkdir build
#cd build
#cmake-gui ..
加入modules路径
勾选C++11特性 — ENABLE_CXX11(可选,注意看configure是否由于C11报错error,有的话取消该选项,对基本使用不影响
)
Configure && Generate , 生成Makefile
问题3
:/opt/wkspace/opencv/opencv_contrib-3.4.1/modules/xfeatures2d/src/vgg.cpp:490:41 fatal error: vgg_generated_120.i: No such file or directory
还有很多类似的xxx.i,都是同个问题
原因:同样是无法连接到该网络,下载这个包
解决方法:https://blog.csdn.net/jiaken2660/article/details/104132060
下载文件后缀该为.tar.gz解压后为:
移动到
重新make解决
问题4
:/opt/wkspace/opencv/opencv-3.4.1/modules/stitching/include/opencv2/stitching/detail/matchers.hpp:52:42: fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory
同样也有一些类似的找不到头文件问题,都同个解决方法
原因:扩展包的include没在gcc编译这个文件时的头文件路径上
解决方法:将对应文件的include处更改为绝对路径
改为:
安装扩展包后:/opt/wkspace/opencv_arm/ouput/lib
(可能可以简化安装包之类,不过这个总大小也就32M,应该影响不大)
参考:【OpenCV+Qt】在Qt界面中显示OpenCV处理的图像
1)pro文件中添加头文件与路径,如下:
INCLUDEPATH += $(opencv目录)/include
LIBS +=$(opencv目录/lib)/libopencv*
如图:
2)在cameratest.cpp中加入头文件opencv2/opencvhpp:
3)创建一个大小合适的label:
4)添加一个pushbutton,并右键进入点击槽函数:
Cameratest.h |
---|
#ifndef CAMERATEST_H
#define CAMERATEST_H
#include
#include
#include
#include
using namespace cv;
namespace Ui {
class CameraTest;
}
class CameraTest : public QWidget
{
Q_OBJECT
public:
explicit CameraTest(QWidget *parent = 0);
~CameraTest();
private slots:
void on_pushButton_clicked();
private:
Ui::CameraTest *ui;
QTimer * mytimer; // 定时获取摄像头图像
VideoCapture cap; // opencv用于打开摄像头的控件
Mat frame; // 从cap中获取一帧图像 是oepncv的BRG格式,输出到label还需转换
private slots:
void cameraOpen();
};
#endif // CAMERATEST_H
Cameratest.cpp |
---|
#include "cameratest.h"
#include "ui_cameratest.h"
using namespace cv;
CameraTest::CameraTest(QWidget *parent) :
QWidget(parent),
ui(new Ui::CameraTest)
{
ui->setupUi(this);
mytimer = new QTimer(this);
connect(mytimer, SIGNAL(timeout()), this, SLOT(cameraOpen()));
cap.open(0); // 打开摄像头 /dev/video0
}
CameraTest::~CameraTest()
{
delete ui;
}
void CameraTest::cameraOpen() {
// 定时获取摄像头数据并显示
mytimer->stop();
cap >> frame; // 从摄像头获取一帧数据
Mat image; // 定义一个Mat存储转换后的RGB格式图像
/* opencv 默认BGR存放;而Image需要用RGB格式 */
cvtColor(frame, image, CV_BGR2RGB);
QImage Qimage = QImage((const unsigned char *)(image.data), // 强转为普通字节流
image.cols, image.rows,
image.step,
QImage::Format_RGB888);
ui->label->setPixmap(QPixmap::fromImage(Qimage));
ui->label->resize(Qimage.size());
ui->label->show(); // 显示到label
mytimer->start(30);
}
/* 按键触发定时器 */
void CameraTest::on_pushButton_clicked()
{
mytimer->start(30);
}
#cat /dev/video0
有乱码输出 ---- 此摄像头设备节点为/dev/video0
我用的是usb转网口,ip静态且固定:
1)配置开发板ip:
2)配置虚拟机ubuntu ip
增加虚拟机 虚拟网络 - - - 桥接到USB网络适配器 :
增加ubuntu虚拟网卡 – 使用刚刚创建的vmnet1
设置ubuntu的ip:
新建网络配置:
将新网卡连接到该网络:
查看ip:
3)互ping:
#vim /etc/exports
#service nfs-server restart
开发板端:
#mount -o nolock 169.254.218.200:/opt /mnt
开发板端:
#cd /mnt/wkspace/opencv_arm/output/lib
#export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH
#cd /mnt/wkspace/Qt_opencv_test/build-Opencvtest-arm_linux-Debug
#./Opencvtest
问题5
:./Opencvtest: error while loading shared libraries: /opt/wkspace/opencv_arm/output/lib/libopencv_aruco.so: cannot open shared object file: No such file or directory
原因:cmake-gui的时候,Operating System写arm-linux时,开发板运行测试程序时候报的错误,其实就是库不完整。
根据博文:https://blog.csdn.net/u013752202/article/details/47358389/的解释:在#cmake-gui的时候,Operating System只能写Linux,经过测试写arm-linux(实际上只是第一次以为没问题emmm)的话编译出来的库不完整,无法运行。
解决方法:仔细核对cmake-gui时是否操作有误,重新配置编译安装
问题6
:
看到rebuild the lib 差点自闭了
原因:在使用QTimer定时之前,我用了waitKey来进行定时/延时,而开发板的lib库不支持waitKey函数(没有gtk)
解决方法:只是个小问题,改成qt自带的qtimer就行了