Ubuntu 18下OpenCV3.4的安裝與使用示例
安裝環境:
VirtualBox虛擬機Ubuntu 18.04系統
OpenCV版本:3.4.14
本機環境:Windows 10
文章目錄
- Ubuntu 18下OpenCV3.4的安裝與使用示例
- 一、認識 OpenCV
- 二、安裝 OpenCV
- 1. 下載 OpenCV 3.4.11 資料包
- 2. 解壓安裝
- 3. 配置環境
- 三、編譯圖片
- 1. 創建檔案
- 2. 編譯
- 四、編譯視頻
- 1. 環境配置:
- 2. 播放視頻
- 3. 錄制視頻
- 五、總結
一、認識 OpenCV
開源計算機視覺(OpenCV)是一個主要針對實時計算機視覺的編程函式庫,
OpenCV的應用領域包括:
- 2D和3D功能工具包
- 運動估計
- 面部識別系統
- 手勢識別
- 人機互動
- 移動機器人
- 動作理解
- 物體識別
- 分割和識別
- 物體影像立體視覺:來自兩個攝像機的深度感知
- 運動中的結構(SFM)
- 運動跟蹤
- 增強現實
為了支持上述一些領域,OpenCV包括一個統計機器學習庫,其中包含:
- 提升(Boosting)
- 決策樹學習
- 梯度提升樹
- 期望最大化演算法
- k最近鄰演算法
- 樸素貝葉斯分類器
- 人工神經網路
- 隨機森林
- 支持向量機(SVM)
- 深層神經網路(DNN)
二、安裝 OpenCV
1. 下載 OpenCV 3.4.11 資料包
OpenCV下載地址:
官網:https://opencv.org/
Github:https://github.com/opencv/opencv/releases
國內:https://www.bzblog.online/wordpress/index.php/2020/03/09/opencvdownload/
推薦選擇國內下載地址,有條件的可以選擇國外原裝進口,
本篇文章采用國內鏡像源下載,在虛擬機中打開游覽器(這里用的火狐),輸入網址,選擇opencv3.4最新版本進行下載:

選擇.zip

Ubuntu中游覽器的默認下載位置是名為“下載”的檔案夾,如果不能通過cd進入可以選擇右鍵檔案夾選擇終端打開來解決
2. 解壓安裝
安裝之前,為了避免麻煩,首先我們輸入sudo su進入root模式,
桌面版的虛擬機可以直接通過滑鼠操作:右鍵壓縮包👉提取到此處,或者在終端輸入以下指令:
unzip opencv-3.4.14.zip
檢查是否安裝了cmake,因為我們需要使用cmake來安裝opencv,所以可以在終端輸入cmake來檢查,如果提示沒有找到,則需要安裝cmake,

安裝cmake:
apt-get install cmake

如果提醒需要apt-get update,那就在終端輸入下面的命令更新
sudo apt-get update
安裝完cmake之后需要安裝依賴包,在終端輸入以下命令來安裝依賴包
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
結果出現了以下問題:無法定位軟體包 xxxx

百度參考了 無法定位軟體包libjasper-dev的解決辦法 后在終端輸入以下命令:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt upgrade
sudo apt install libjasper1 libjasper-dev
若有提示輸入[Y/n]一律Y過去,

安裝完cmake之后執行命令,創建編譯檔案夾,進入build檔案夾
mkdir build
cd build
使用cmake編譯引數
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
使用make創建編譯:仍然在build檔案夾下進行,在終端輸入
sudo make -j4

不加 -j4 智障系統會使用單執行緒編譯,很浪費時間!而博主這里盡管通過 -j4使用四執行緒編譯也等了二十多分鐘
編譯好后執行如下命令安裝OpenCV
sudo make install

3. 配置環境
安裝好opencv后,接下來就需要配置一些OpenCV的編譯環境,首先將OpenCV的庫添加到路徑,呼叫OpenCV時使用庫函式時系統可以找到庫函式的位置,在終端輸入下面的命令
sudo gedit /etc/ld.so.conf.d/opencv.conf
或者選擇其他的文本編輯軟體如nano、vi/vim等打開,編輯系統檔案需要添加sudo選項,執行此命令后打開的檔案
可能是空白檔案,在檔案中添加以下內容
/usr/local/lib

點擊右上角保存,然后關閉檔案,
退出之后會發現有警告資訊,不要擔心,這是正常情況
更新系統共享鏈接庫
sudo ldconfig
配置bash,修改bash.bashrc檔案
sudo gedit /etc/bash.bashrc
打開檔案后,在最末尾添加下面的文字
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
點擊保存后關閉文本編輯器

然后執行下面的命令使配置生效和更新
source /etc/bash.bashrc
sudo updatedb
所有配置已經完成,之后可以順便查看一下OpenCV的版本資訊
pkg-config --modversion opencv

版本無誤,開始后面的步驟,
三、編譯圖片
1. 創建檔案
首先創建test.cpp并編輯它
gedit test.cpp
輸入以下代碼
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
CvPoint center;
double scale = -3;
IplImage* image = cvLoadImage("temp.jpg");
argc == 2? cvLoadImage(argv[1]) : 0;
cvShowImage("Image", image);
if (!image) return -1; center = cvPoint(image->width / 2, image->height / 2);
for (int i = 0;i<image->height;i++)
for (int j = 0;j<image->width;j++) {
double dx = (double)(j - center.x) / center.x;
double dy = (double)(i - center.y) / center.y;
double weight = exp((dx*dx + dy*dy)*scale);
uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);
ptr[0] = cvRound(ptr[0] * weight);
ptr[1] = cvRound(ptr[1] * weight);
ptr[2] = cvRound(ptr[2] * weight);
}
Mat src;Mat dst;
src = cvarrToMat(image);
cv::imwrite("test.png", src);
cvNamedWindow("test",1); imshow("test", src);
cvWaitKey();
return 0;
}

上面的代碼里面我們用到了mat資料型別,在OpenCV的官網上面可以查詢到相關資料
官網Mat解釋:https://docs.opencv.org/3.4.14/d3/d63/classcv_1_1Mat.html

2. 編譯
OpenCV的矩陣是用Mat這個物件來存盤的,并且提供了一些函式操作矩陣的屬性,關于Mat資料型別的更多知識,請在OpenCV官網或者在CSDN上搜索,
接下來編譯檔案,執行下面的命令(注意:后面的符號`是英文輸入狀態下鍵盤左上角的~)
gcc test.cpp -o test `pkg-config --cflags --libs opencv`
如果出現以下錯誤,則需要用C++編譯器編譯介面模塊,

解決方法是打開相關的so下的build.sh(每個產生so目錄下,都寫了build.sh),把gcc改成g++,然后再重新編譯,或者直接將輸入的命令中的gcc改為g++
g++ test.cpp -o test `pkg-config --cflags --libs opencv`

在同一檔案夾下準備一張圖片,命名為temp.jpg

執行編譯好的可執行檔案test,可以看到生成了test.png


四、編譯視頻
1. 環境配置:
如果使用虛擬機來進行本實驗,那么需要讓虛擬機獲取攝像頭的權限,因為本人使用的虛擬機是VirtualBox6,與其他的VM虛擬機獲取權限的步驟有所出入,
以下步驟參考ROS與虛擬機-配置Vbox(Ubuntu)使用主機攝像頭
配置Vbox(Ubuntu)使用主機攝像頭
說明
- 在虛擬機里難免要使用內置或外置的攝像頭
- 比如在做ROS By Example例子就要使用usbcam
- 比如開發Opencv,使用攝像頭捕抓影像
- 要使用USB,就需要安裝擴展Oracle_VM_VirtualBox_Extension_Pack
步驟
-
下載Oracle_VM_VirtualBox_Extension_Pack
點擊進入下載頁面,選擇對應版本,因為本人使用的6以上的版本所以這里選擇6.1.0_RC1,然后下載下圖所標注的任意一個拓展包,


-
安裝到virtualbox, 在
virtualbox管理器👉管理👉全域設定👉擴展,并在右上角的添加擴展,選擇拓展包所在位置,確定,

-
啟用攝像頭
安裝完成后,啟動虛擬機,
在 設備 -> 攝像頭 -> 啟用攝像頭設備(名字各有不同)

啟用后,可以通過命令:
ls /dev/video*
查看是否存在 camera 設備,

測驗 camera
一般測驗攝像頭用到的命令是 cheese,以下是相關命令
sudo apt-get install -y //cheese安裝 cheese
cheese //呼叫 cheese
cheese -d /dev/video1 //呼叫指定的攝像頭
但是在我的虛擬機測驗卻找不到設備,不知道原因,可能是戴爾的問題,

所以換一下其他方法
安裝 xawtv
sudo apt-get install -y xawtv
呼叫 xawtv
xawtv
呼叫指定的攝像頭
xawtv -d /dev/video1

欸,還是不行,但這次至少沒有找不到設備,經過一番搜索之后,有人給出的答案是部分筆記本電腦的攝像頭無法被識別,那就是DELL的G3筆記本不夠優秀了,這不能賴我,
2. 播放視頻
創建一個test1.cpp檔案,代碼如下
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
VideoCapture capture;
//capture.open(0); //打開攝像頭
capture.open("temp.mp4"); //打開視頻
if (!capture.isOpened())
{
cout << "video not open." << endl;
return 1;
}
double rate = capture.get(CV_CAP_PROP_FPS); //獲取當前視頻幀率
//當前視頻幀
Mat frame;
//每一幀之間的延時
int delay = 1000/ rate; //與視頻的幀率相對應
while (1)
{
if (!capture.read(frame)) //獲取視頻或攝像頭的每一幀
{
cout << "no video frame" << endl;
break;
}
imshow("video", frame);
//引入延時
//也可通過按鍵停止
int k = waitKey(30);
// 實作按鍵暫停和退出視頻播放功能
if (k == 27)
break;
else if (k == 32)
{
while (waitKey(0) != 32)
waitKey(0);
}
}
//關閉視頻,手動呼叫解構式(非必須)
capture.release();
return 0;
}
注意得在同目錄下有一個叫
temp.mp4的視頻才行
打開效果如下,在鍵盤下按Esc推出,按下空格暫停/繼續,

3. 錄制視頻
創建一個test2.cpp程式,代碼如下
#include<iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
//打開電腦攝像頭
VideoCapture cap(0);
if (!cap.isOpened())
{
cout << "error" << endl;
waitKey(0);
return 0;
}
//獲得cap的解析度
int w = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH));
int h = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));
Size videoSize(w, h);
VideoWriter writer("RecordVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25, videoSize);
Mat frame;
int key;//記錄鍵盤按鍵
char startOrStop = 1;//0 開始錄制視頻; 1 結束錄制視頻
char flag = 0;//正在錄制標志 0-不在錄制; 1-正在錄制
while (1)
{
cap >> frame;
key = waitKey(100);
if (key == 32)//按下空格開始錄制、暫停錄制 可以來回切換
{
startOrStop = 1 - startOrStop;
if (startOrStop == 0)
{
flag = 1;
}
}
if (key == 27)//按下ESC退出整個程式,保存視頻檔案到磁盤
{
break;
}
if (startOrStop == 0 && flag==1)
{
writer << frame;
cout << "recording" << endl;
}
else if (startOrStop == 1)
{
flag = 0;
cout << "end recording" << endl;
}
imshow("picture", frame);
}
cap.release();
writer.release();
destroyAllWindows();
return 0;
}
編譯test2.cpp檔案,在終端輸入下面的命令
g++ test2.cpp -o test2 `pkg-config --cflags --libs opencv`
./test2
運行效果如下圖所示:

在按鍵上按下空格鍵暫停錄制/開始錄制,按下ESC鍵退出錄制,錄制好的視頻會保存在同一目錄下,

打開看看剛才錄制的視頻

錄制成功,除了沒有用到攝像頭以外其他都還不錯😟😟
五、總結
經過幾個實驗,發現OpenCV確實功能強大,(但還有些坑需要自己去填,比如這個攝像頭😢)所以能在多個功能得到應用,而且OpenCV支持多種語言,還可以在Windows系統下進行視頻開發
參考文章:
ROS與虛擬機-配置Vbox(Ubuntu)使用主機攝像頭
ZONE畫派:VirtualBox 呼叫攝像頭
江南煙膿雨:Ubuntu 18.04下OpenCV的安裝與簡單應用
可樂有點好喝:Ubuntu18.04下OpenCV3.4.11的安裝及使用示例
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/323271.html
標籤:其他
上一篇:OpenCV 矩陣的掩膜操作
下一篇:基于二軸云臺目標跟蹤系統設計


