Python、C++、Android OpenCV 開發(fā)環(huán)境的配置

歡迎訪問個(gè)人博客:https://glumes.com

在 Mac 上折騰了一下 OpenCV 的配置,分別配置了 Python 、C++ 和 Android 上的開發(fā)環(huán)境,中間還遇到點(diǎn)坑,簡(jiǎn)要記錄一下。

OpenCV 的安裝

OpenCV 的安裝有兩種方式,可以通過下載源碼自行編譯,也可以通過homebrew來安裝。

源碼編譯

通過源碼編譯可以參考下面這兩篇文章:

1、https://www.pyimagesearch.com/2016/12/05/macos-install-opencv-3-and-python-3-5/

2、https://www.pyimagesearch.com/2015/06/29/install-opencv-3-0-and-python-3-4-on-osx/

大致操作都是要從 Github 上下載好源碼,然后配置 cmake ,再通過 make 編譯出 cv2.so 庫(kù)。

Homebrew 安裝

通過 homebrew 來安裝 OpenCV 就相對(duì)簡(jiǎn)單多了。

直接 brew install opencv 命令就好了。

不過,要注意的是:下載好的 OpenCV 還在 /usr/local/Cellar/opencv/3.3.1_1/ 目錄下。

這時(shí)候,在 Terminal 上,直接運(yùn)行 Python3 命令,然后在交互式環(huán)境中通過 import cv2的命令來導(dǎo)入 OpenCV 的庫(kù)依舊是找不到的。

解決辦法就是進(jìn)入到 /usr/local/lib/python3.6/site-packages 目錄下,通過 ln 命令將 /usr/local/Cellar/opencv/3.3.1_1/lib/python3.6/site-packages 目錄下的 cv2.so 鏈接到當(dāng)前目錄。

///usr/local/lib/python3.6/site-packages 目錄下執(zhí)行如下指令
sudo ln -s /usr/local/Cellar/opencv/3.3.1_1/lib/python3.6/site-packages/cv2.so cv2.so

這樣就可以完成導(dǎo)入了。

Python 配置 OpenCV 環(huán)境

Python 開發(fā)用的 IDE 是 PyCharm。

事實(shí)上在 PyCharm 的 Project Interpreter 中可以添加 Python 庫(kù)的,直接選擇 opencv-python 庫(kù)就好了,它最終也是通過 pip命令來下載對(duì)應(yīng)的庫(kù)的。

但卻有個(gè)問題:

通過這種方式安裝的 OpenCV 在運(yùn)行播放視頻的代碼時(shí)會(huì)出錯(cuò):

import cv2
videoUrl = "/Users/glumes/Desktop/kpt1.mp4"
cap = cv2.VideoCapture('/Users/glumes/Desktop/kpt1.mp4')
while(cap.isOpened()):
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame', gray)
    if cv2.waitKey(0) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

報(bào)錯(cuò)的內(nèi)容是:The current event queue and the main event queue are not the same

正好在 OpenCV 的 Github 上有個(gè) Issue 也提到了這個(gè)問題:https://github.com/opencv/opencv/issues/7474

給出的原因是因?yàn)闆]有安裝好 ffmpeg。

所以還是建議直接通過 brew 的方式安裝,然后再創(chuàng)建鏈接好了。

安裝好之后,就可以開始運(yùn)行我們的 OpenCV 代碼了。

簡(jiǎn)單的展示一張圖片代碼示例:

import cv2
print(cv2.__version__)
imgUrl = '/Users/glumes/Desktop/blog_camera_block.png'
img = cv2.imread(imgUrl,0)
cv2.imshow('image',img)
cv2.waitKey(0)
print("waiting")
cv2.destroyAllWindows()

C++ 配置 OpenCV 環(huán)境

C++ 開發(fā)用的 Mac 的 Xcode。

首先要在 Xcode 中創(chuàng)建一個(gè)命令行工程。

mac-command-line-project

然后在工程名處右鍵,選擇 Add File to Project,通過快捷鍵 Command+Shift+G進(jìn)入到 /usr/local/lib目錄下,將所有和 OpenCV 相關(guān)的 dylib 庫(kù)添加進(jìn)來。

完成了之后,再到工程的 Build Settings中去添加對(duì)應(yīng)的頭文件和庫(kù)文件。

找到 Search Paths,然后在 Header Search Paths 中添加

  • /usr/local/include
  • /usr/local/include/opencv

在 Library Search Paths 中添加

  • /usr/local/lib

效果圖如下:

xcode_build_setting

完成之后,就可以開始編寫 C++ 代碼來開發(fā) OpenCV 了。

同樣還是預(yù)覽一張圖片作為示例:

//
//  main.cpp
//  OpenCVEnv
//
//  Created by glumes on 2017/11/7.
//  Copyright ? 2017年 glumes. All rights reserved.
//

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv/cvaux.hpp>
#include <fstream>
using namespace std;
#define BYTE unsigned char

int main(int argc, const char * argv[])
{
    //這個(gè)地方的目錄需要改成自己的
    IplImage* img = cvLoadImage("/Users/glumes/Desktop/blog_opengl_result_point.png", 1);
    cvNamedWindow("picture", 1);
    cvShowImage("picture", img);
    cvWaitKey(0);
    cvReleaseImage(&img);
    cvDestroyWindow("picture");
    return 0;
}

點(diǎn)擊運(yùn)行,當(dāng)編譯成功時(shí),就可以看到多了一個(gè)命令行窗口,里面就是我們預(yù)覽的圖片內(nèi)容。

完成了開發(fā)環(huán)境的配置之后,就可以愉快地進(jìn)行 OpenCV 開發(fā)咯。

Android 配置 OpenCV 開發(fā)環(huán)境

在 Android 上配置 OpenCV 的環(huán)境相對(duì)就簡(jiǎn)單多了。

首先要做的就是在官網(wǎng)上 https://opencv.org/releases.html 下載好對(duì)應(yīng)的 SDK ,有 2.x 版本的也有 3.x 版本的。

解壓之后,主要有三個(gè)目錄:apk、sdksamples,要關(guān)心的就是sdk目錄了。

在 AS 上新建一個(gè) Android 工程,創(chuàng)建時(shí)最好先勾選了 C++ Support 選項(xiàng),后面會(huì)在 CMakeLists.txt 文件中進(jìn)行更改。

然后選擇 Import Module,在彈出的框中,選擇下載好的 SDK 的 java 文件夾,如下圖:

import_opencv_module

這會(huì)將 OpenCV 提供的對(duì) NDK 調(diào)用封裝的庫(kù)以依賴的形式導(dǎo)入到我們的工程。

別忘了在工程的 build.gradle 添加如下代碼來導(dǎo)入

  implementation project(':OpenCVLibrary330')

之后,就是導(dǎo)入 so 動(dòng)態(tài)庫(kù)。

將 OpenCV-android-sdk\sdk\native\libs 目錄下的內(nèi)容拷貝到應(yīng)用的 jibLibs 目錄下。

import_opencv_sp

接下來修改 CMakeLists.txt 文件,將頭文件和庫(kù)進(jìn)行導(dǎo)入。

# 包含頭文件
 include_directories(/Users/glumes/Downloads/OpenCV-android-sdk/sdk/native/jni/include)
# 添加 lib_opencv 動(dòng)態(tài)庫(kù)
 add_library( lib_opencv SHARED IMPORTED )
# 設(shè)置庫(kù)的導(dǎo)入路徑
 set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)

這里僅僅是導(dǎo)入了 libs 目錄下的動(dòng)態(tài) so 庫(kù),也可以將靜態(tài)的 .a 庫(kù)導(dǎo)入。

完成了這一步后,就可以用 C++ 進(jìn)行 OpenCV 的開發(fā)了。

在默認(rèn)的 native-lib 動(dòng)態(tài)庫(kù)中,添加 opencv 的動(dòng)態(tài)庫(kù),這樣就可以鏈接到了。

target_link_libraries( # Specifies the target library.
                       native-lib
                       # 鏈接 opencv 的動(dòng)態(tài)庫(kù)
                       lib_opencv

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

具體的詳細(xì)配置 Demo 可以參考我的 Github 地址 https://github.com/glumes/AndroidOpenCV

參考

1、http://www.itdecent.cn/p/11959977589a

一起交流學(xué)習(xí),答疑解惑,有問題,我們星球見~~~


圖形/圖像/音視頻交流

覺得文章還不錯(cuò),可以關(guān)注一下微信公眾號(hào)【紙上淺談】

Wechat
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容