Raspberry Pi安裝OpenCV_解惑篇

Ryan Lu
Linux on raspberry pi4
4 min readSep 15, 2020

前言:
安裝部分請參考,Raspberry Pi安裝OpenCV_安裝篇
版主在安裝時,試過許多網路大神的安裝方式,這篇是整理這些方式所遇到的困難與解決方法,不全是安裝篇會遇到的,若讀者有遇到相同問題的就可以參考看看。

環境:
1.Raspberry Pi 4
2.Micro SD Card 64G
3.kernel = Linux raspberrypi 5.4.51-v7l+
4.OS = Raspbian GNU/Linux 10 (buster) VERSION=”10 (buster)”

解惑:
問題1:
/usr/include/c++/8/cstdlib:75:15: fatal error: stdlib.h: 沒有此一檔案或目錄

解法:(不用預編譯頭文件)
預處理程序指令#include_next的行為與#include指令相似,不同之處在於,它專門從要搜索命名文件的路徑中排除包含文件的目錄。這解釋為什麼cstdlib不在同一文件夾中找到stdlib.h。

方法1.
生成所需的makefile時候加上此參數項 : -D ENABLE_PRECOMPILED_HEADERS=OFF
方法2.
到路徑中的頭文件(/usr/include/c++/8/cstdlib)裡面,屏蔽此行 stdlib.h

問題2:
error: ‘AVFMT_RAWPICTURE’ was not declared in this scope
error: ‘CODEC_FLAG_GLOBAL_HEADER’ was not declared in this scope

原因:
因為OPENCV和FFMPEG是分別開發的。 OPENCV編譯3.3.1版本的時候,採用的FFMPEG不是你現在使用的這個庫,OPENCV的維護人員也沒發現這個錯誤。可能去嘗試不同的FFMPEG版本來匹配這個OPENCV版本。

解法:
因為FFmpeg缺少的這幾個定義,可在libavcodec / avcodec.h中找到以下代碼:
#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020
複製並將其粘貼到以下內容的頂部:
opencv-3.3.0/modules/videoio/src/cap_ffmpeg_impl.hpp

問題3:
python 中import cv2 之後出現以下錯誤,
ImportError: /usr/local/lib/python3.7/dist-packages/cv2/cv2.cpython-37m-arm-linux-gnueabihf.so: undefined symbol: __atomic_fetch_add_8

解法:
該方法每次啟動python都需要執行一次
$ sudo find / -type f -name ‘atom.so*’
$ LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1.2.0 python3

試過無效解法:
1.在失敗的cmake模塊的link.txt文件中添加了-latomic
2.生成所需的makefile時候加上此參數項 :
-DCMAKE_CXX_FLAGS=-latomic
-D OPENCV_EXTRA_EXE_LINKER_FLAGS=-latomic

[參考]
1.Raspberry Pi 安装 OpenCV

--

--