opencv庫撰寫打開攝像頭壓縮視頻的程式
- 一、認識 OpenCV
- (一)官方網站
- (二)簡介
- (三)資料型別
- (四)應用領域
- 二、安裝openCV
- (一)下載安裝包
- (二)解壓縮包
- (三)使用 cmake 安裝 opencv
- (四)使用 make 創建編譯并安裝
- (五)配置環境
- 三、使用示例lena圖片
- (一)實體圖片lena(萊娜)
- (二)新建檔案夾code
- (三)新建檔案 test1.cpp
- (四)編譯test1.cpp檔案
- (五)運行
- 五、使用示例——視頻
- (一)虛擬機獲取攝像頭權限
- (二)播放視頻
- (三)錄制視頻
- 六、總結
- 七、參考資料
一、認識 OpenCV
(一)官方網站
官方網站:http://www.opencv.org.cn/
(二)簡介
| 名稱 | 內容 |
|---|---|
| CV | 核心函式庫 |
| CVAUX | 輔助函式庫 |
| CXCORE | 資料結構與線性代數庫 |
| HIGHGUI | GUI函式 |
| 命名規則 | cvActionTargetMod() |
(三)資料型別
| 名稱 | 內容 |
|---|---|
| 矩陣 | CV_8UC1 、 8位無符號數單通道 |
| 影像 | PL_DEPTH_8U 8位無符號 |
| 頭檔案 | #include 5個核心模塊的.h |
(四)應用領域
- OpenCV的應用領域包括:
- 2D和3D功能工具包
- 運動估計
- 面部識別系統
- 手勢識別
- 人機互動
- 移動機器人
- 動作理解
- 物體識別
- 分割和識別
- 物體影像立體視覺:
- 來自兩個攝像機的深度感知
- 運動中的結構(SFM)
- 運動跟蹤
- 增強現實
二、安裝openCV
(一)下載安裝包
國內快速下載地址:https://www.bzblog.online/wordpress/index.php/2020/03/09/opencvdownload/
注:可以直接在虛擬機中使用瀏覽器(我的是firefox)進行下載,國外官網下載地址:https://github.com/opencv/opencv/releases

(二)解壓縮包
1.在解壓縮包之前,將 opencv-3.4.11.zip 復制到主目錄檔案夾下

2.進入命令列模式,輸入命令
unzip opencv-3.4.11.zip

3.進入到解壓后的檔案包中
cd opencv-3.4.11

(三)使用 cmake 安裝 opencv
1.首先進入 root 用戶,并更新一下
sudo su
sudo apt-get update

2.接著再執行這條命令安裝 cmake
sudo apt-get install cmake

直接按enter默認繼續
3.cmake安裝完成

4.安裝依賴庫
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev

5.再創建 build 檔案夾,鍵入build檔案夾
mkdir build
cd build

6.使用 cmake 編譯引數,或者使用第二條默認引數,都可以的
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
cmake ..

運行結果

(四)使用 make 創建編譯并安裝
1.仍然是在 build 檔案夾下進行
sudo make

2.編譯完成

3.安裝
sudo make install

4.安裝完成

(五)配置環境
1.修改 opencv.conf 檔案,打開后的檔案是空的,添加 opencv 庫的安裝路徑:/usr/local/lib
sudo gedit /etc/ld.so.conf.d/opencv.conf


2.出現警告資訊,不用擔心,正常情況

3.更新系統共享鏈接庫
sudo ldconfig

4.配置 bash ,修改 bash.bashrc 檔案
sudo gedit /etc/bash.bashrc

5.在檔案末尾加入:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

6.然后執行如下命令使得配置生效
source /etc/bash.bashrc

7.更新一下
sudo updatedb

8.查看 opencv 的版本資訊
pkg-config --modversion opencv
出現以下資訊安裝成功

三、使用示例lena圖片
(一)實體圖片lena(萊娜)

(二)新建檔案夾code
mkdir code
cd code

(三)新建檔案 test1.cpp
1.用命令新建test1.cpp檔案
vim test1.cpp

2.test1.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("lena.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;
}

3.把圖片lena.jpg粘貼到code目錄下

(四)編譯test1.cpp檔案
g++ test1.cpp -o test1 `pkg-config --cflags --libs opencv`

(五)運行
(1)輸入代碼
./test

(2)運行結果

五、使用示例——視頻
(一)虛擬機獲取攝像頭權限
1.使用快捷鍵 Win + R ,輸入 services.msc ,并回車,

2.找到 VMware USB Arbitration S… 服務,確保啟動成功

3.點擊 “ 虛擬機 ” ,然后點擊 “ 設定(S)… ”
4.選擇 “ USB控制器 ” ,將 “ USB兼容性 ” 設定為 “ USB 3.1 ” ,并點擊確定
5.選擇 “ 虛擬機 ” ,再選擇 “ 可移動設備 ” ,再選擇 “ Quanta USB2.0 VGA UVC WebCam ” ,最后點擊 “ 連接 ” ,再彈出的視窗內點擊 “ 確定 ”


(二)播放視頻
1.創建一個 test2.cpp 檔案,
vi test2.cpp

2.test2.cpp代碼
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
//從攝像頭讀取視頻
VideoCapture capture("xiaozhan.mp4");
//回圈顯示每一幀
while(1){
Mat frame;//定義一個Mat變數,用于存盤每一幀的影像
capture >> frame;//讀取當前幀
if(frame.empty())//播放完畢,退出
break;
imshow("讀取視頻幀",frame);//顯示當前幀
waitKey(30);//掩飾30ms
}
system("pause");
return 0;
}
按Esc,輸入:wq保存退出

3.把視頻粘貼到code目錄下

注釋
- 如果陳述句:VideoCapture capture(0),后面的引數設定為 0 ,則從攝像頭讀取視頻并回圈顯示每一幀;如果設定為一個視頻的檔案名,比如:man.mp4 ,則會將視頻讀取并回圈顯示每一幀,
- while 回圈體中的 Mat 資料結構其實是一個點陣,對應影像上的每一個點,點的集合形成了一幀影像,有關 Mat 詳解請看:OpenCV中Mat資料結構
- 陳述句:waitKey(30) ,中的引數單位是 ms 毫秒,也就是每一幀間隔 30 ms ,該陳述句時不能洗掉的,否則會執行錯誤,無法播放視頻或錄制視頻
4.編譯 test2.cpp 檔案
g++ test2.cpp -o test2 `pkg-config --cflags --libs opencv`

5.輸出結果
./test2


(三)錄制視頻
1.創建一個 test3.cpp
vi test3.cpp

2.test3.cpp代碼
//打開電腦攝像頭,空格控制視頻錄制,ESC退出并保存視頻RecordVideo.avi
#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;
}

3.編譯 test3.cpp 檔案
g++ test3.cpp -o test3 `pkg-config --cflags --libs opencv`

4.運行test3
./test

5.結果輸出,空格開始錄制,Esc結束


六、總結
本次實驗我更加熟悉了ubuntu虛擬機的apt-get等安裝命令,也更加了解安裝、編譯、運行程序中各種可能出現的問題和解決方案,安裝opencv的程序比較艱難,總會產生各種軟體包依賴的問題,網上看了很多的博主的解答學到了很多,由于我的ubuntu版本是20.04版本,版本較新,安裝了依賴包后又會存在安裝后的軟體包依賴更舊的軟體包的問題,本想用aptitude解決依賴包,但是后來一直發現會存在軟體包沖突,最后重裝了ubuntu18.04的版本后順利完成了opencv的入門實訓,我對虛擬機了解更多,以及虛擬機安裝后一些基本的配置等,
七、參考資料
Ubuntu18.04下OpenCV3.4.11的安裝及使用示例
Ubuntu 20.04 依賴包安裝錯誤解決方案
ubuntu20.04安裝opencv步驟及依賴報錯:E: 無法定位軟體包 libjasper-dev
Ubuntu安裝git
OpenCV菜鳥紀實(1)
如何實作VMware下Ubuntu系統和Windows系統檔案之間的復制和粘貼?
錯誤解決辦法:_ZNSaIcED1Ev@@GLIBCXX_3.4
Ubuntu18.04下OpenCV3.4.11的安裝及使用示例
【嵌入式】Windows10&Ubantu16.04&樹莓派3B+安裝opencv教程
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/321493.html
標籤:其他
上一篇:簡單用Java寫了一個爬蟲。
下一篇:關于瓦力機器人的設計構想
