树莓派4B安装opencv以及错误解决

更新于2020/4/27 更新:换了个树莓派4B,安装opencv的时候遇到了一些之前没碰到的问题,在这里记录一下

主要参考opencv官网文档和博客树莓派+Opencv(一)图像处理

树莓派4B上安装参考:树莓派4B 安装opencv完整教程基于python3(各种错误解决)

下载安装依赖项

sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

在4B上安装时遇到libgtk2.0-dev安装失败的问题:

这是因为依赖项版本太高了,需要降级安装。所以可以使用命令sudo aptitude install libgtk2.0-dev来进行安装

在安装过程中,首先会给出一个方案提示是否接受,第一个给出的方案是保留原依赖项,我们要输入n否定它,之后给出第二个方案是降级安装,输入Y使用该方案

其中aptitude是一个类似apt-get的包管理工具,但是它能更好处理依赖问题,支持降级安装

下载源码

从GitHub下载:

opencv

opencv_contrib

两个都下载.zip压缩包即可

解压源码并进入文件夹

unzip opencv-4.3.0.zip
unzip opencv_contrib-4.3.0.zip
cd opencv-4.3.0

创建一个build文件夹用于编译

mkdir build
cd build

运行cmake-gui

这一步其实也可以直接使用cmake配合各类参数,不过我觉得图形化界面方便一点

cmake-gui

选择源码路径和编译路径后点击Configure

cmake-gui

之后在中间的选择框中找到项目BUILD_TESTS,把它的复选框取消

这一步是因为后面编译过程中,总是由于opencv_test_xxx这类项目导致编译失败,因此我在这里将它取消

之后点击Generate生成,最后输出如图所示则可以进行下一步

generate

编译

build目录执行make开始编译,-j表示使用多少线程进行编译,不加数字代表不限制(很容易出问题,不推荐)

之前使用树莓派3B我选择的-j1,用时约3小时;现在4B我选的是-j4,用时约半个小时

sudo make -j4

make

问题

我的4B在这一步就遇到了一个问题,如图

(这个图我是找的其他人的,不过错误都是一样的)

这是一个包丢失的问题,解决方案:

可以在一个大佬的百度云盘里下载

将所有带i结尾的文件全部都拷贝到opencv_contrib/modules/xfeatures2d/src/ 路径下即可 树莓派安装opencv时丢失的文件: 链接:https://pan.baidu.com/s/1xi6_5NuTFiP4SD649FgIJw 提取码:mbsj 原文链接:https://blog.csdn.net/weixin_43308627/article/details/97814927

之后重新make就可以再次开始

安装库

build目录执行

sudo make install

完成后opencv就已经配好了

测试

Python运行

使用这里提供的测试程序测试opencv是否正常

# -*- coding:utf-8 -*-
import cv2
import numpy as np
cv2.namedWindow("gray")
img = np.zeros((512,512),np.uint8)#生成一张空的灰度图像
cv2.line(img,(0,0),(511,511),255,5)#绘制一条白色直线
cv2.imshow("gray",img)#显示图像
#循环等待,按q键退出
while True:
	key=cv2.waitKey(1)
	if key==ord("q"):
		break
cv2.destoryWindow("gray")

最后运行正常,如图

python-opencv

C++运行

先使用cmake编译,再使用make编译

编写cpp代码

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std; 
using namespace cv; 

int main(int argc, char const *argv[])
{
	Mat img = imread("image.jpg"); 
	if (img.empty())
	{
		cout << "error!" << endl; 
		exit(0)
	}
	namedWindow("image1", WINDOW_NORMAL); 
	namedWindow("image2", WINDOW_NORMAL); 
	imshow("image1", img); 
	cvtColor(img, img, COLOR_BGR2GRAY); 
	blur(img, img, Size(7, 7)); 
	Mat edges; 
	Canny(img, edges, 3, 9, 3); 
	imshow("image2", edges); 

	waitKey(0); 
	return 0; 
}

在同目录创建CMakeLists.txt文件

内容:

cmake_minimum_required(VERSION 2.6)
project(test_opencv) #项目名 可改
find_package(OpenCV REQUIRED)
add_executable(test_opencv test_opencv.cpp) 
	#项目名和cpp文件名
target_link_libraries(test_opencv ${OpenCV_LIBS}) #项目名

之后就能用cmake编译啦

cmake .
make

运行

编译完成后,使ls查看目录下文件

ls-opencv_test

绿色的就是编译生成的文件

运行试试

./opencvtest

opencv+cpp_test

于是树莓派的opencv终于安装完成啦,接下来就要调用树莓派摄像头

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus