天天看點

Python、C++、Android OpenCV 開發環境的配置

作者:星隕

來源:

音視訊開發進階

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

庫。

Homebrew 安裝

通過 homebrew 來安裝 OpenCV 就相對簡單多了。

直接

brew install opencv

指令就好了。

不過,要注意的是:下載下傳好的 OpenCV 還在

/usr/local/Cellar/opencv/3.3.1_1/

目錄下。

這時候,在 Terminal 上,直接運作 Python3 指令,然後在互動式環境中通過

import cv2

的指令來導入 OpenCV 的庫依舊是找不到的。

解決辦法就是進入到

/usr/local/lib/python3.6/site-packages

目錄下,通過

ln

指令将

/usr/local/Cellar/opencv/3.3.1_1/lib/python3.6/site-packages

目錄下的

cv2.so

連結到目前目錄。

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

這樣就可以完成導入了。

Python 配置 OpenCV 環境

Python 開發用的 IDE 是 PyCharm。

事實上在 PyCharm 的 Project Interpreter 中可以添加 Python 庫的,直接選擇

opencv-python

庫就好了,它最終也是通過

pip

指令來下載下傳對應的庫的。

但卻有個問題:

通過這種方式安裝的 OpenCV 在運作播放視訊的代碼時會出錯:

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()      

報錯的内容是:

 The current event queue and the main event queue are not the same

正好在 OpenCV 的 Github 上有個 Issue 也提到了這個問題:

https://github.com/opencv/opencv/issues/7474

給出的原因是因為沒有安裝好 ffmpeg。

是以還是建議直接通過 brew 的方式安裝,然後再建立連結好了。

安裝好之後,就可以開始運作我們的 OpenCV 代碼了。

簡單的展示一張圖檔代碼示例:

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 環境

C++ 開發用的 Mac 的 Xcode。

首先要在 Xcode 中建立一個指令行工程。

然後在工程名處右鍵,選擇

Add File to Project 

,通過快捷鍵

Command+Shift+G

進入到

/usr/local/lib

目錄下,将所有和 OpenCV 相關的

dylib

庫添加進來。

完成了之後,再到工程的

Build Settings

中去添加對應的頭檔案和庫檔案。

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

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

在 Library Search Paths 中添加

  • /usr/local/lib

效果圖如下:

完成之後,就可以開始編寫 C++ 代碼來開發 OpenCV 了。

同樣還是預覽一張圖檔作為示例:

//
//  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[])
{
    //這個地方的目錄需要改成自己的
    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;
}      

點選運作,當編譯成功時,就可以看到多了一個指令行視窗,裡面就是我們預覽的圖檔内容。

完成了開發環境的配置之後,就可以愉快地進行 OpenCV 開發咯。

Android 配置 OpenCV 開發環境

在 Android 上配置 OpenCV 的環境相對就簡單多了。

首先要做的就是在官網上

https://opencv.org/releases.html

下載下傳好對應的 SDK ,有 2.x 版本的也有 3.x 版本的。

解壓之後,主要有三個目錄:

apk

sdk

samples

,要關心的就是

sdk

目錄了。

在 AS 上建立一個 Android 工程,建立時最好先勾選了 C++ Support 選項,後面會在 CMakeLists.txt 檔案中進行更改。

然後選擇 Import Module,在彈出的框中,選擇下載下傳好的 SDK 的 java 檔案夾,如下圖:

這會将 OpenCV 提供的對 NDK 調用封裝的庫以依賴的形式導入到我們的工程。

别忘了在工程的 build.gradle 添加如下代碼來導入

implementation project(':OpenCVLibrary330')      

之後,就是導入

so

動态庫。

将 OpenCV-android-sdk\sdk\native\libs 目錄下的内容拷貝到應用的 jibLibs 目錄下。

接下來修改 CMakeLists.txt 檔案,将頭檔案和庫進行導入。

# 包含頭檔案
 include_directories(/Users/glumes/Downloads/OpenCV-android-sdk/sdk/native/jni/include)
# 添加 lib_opencv 動态庫
 add_library( lib_opencv SHARED IMPORTED )
# 設定庫的導入路徑
 set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)      

這裡僅僅是導入了 libs 目錄下的動态 so 庫,也可以将靜态的

.a

庫導入。

完成了這一步後,就可以用 C++ 進行 OpenCV 的開發了。

在預設的 native-lib 動态庫中,添加 opencv 的動态庫,這樣就可以連結到了。

target_link_libraries( # Specifies the target library.
                       native-lib
                       # 連結 opencv 的動态庫
                       lib_opencv
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )      

具體的詳細配置 Demo 可以參考我的 Github 位址

https://github.com/glumes/AndroidOpenCV

參考

http://www.jianshu.com/p/11959977589a 标簽: Opencv
「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。  
Python、C++、Android OpenCV 開發環境的配置