文章目錄
- 一、如何在Ubuntu下安裝opencv
- 二、使用opencv打開一張圖片
- 三、使用opencv打開攝像頭
- 四、使用opencv打開一個視頻檔案
- 五、通過攝像頭采集影像并壓縮成視頻
- 六、參考🔗
一、如何在Ubuntu下安裝opencv
具體安裝細節請參考:【嵌入式】Windows10&Ubantu16.04&樹莓派3B+安裝opencv教程
從 GitHub 下載opencv時,可能等待時間比較長,因為GitHub的服務器在國外,因此可用國內的gitee,通過 fork 匯入 GitHub上的opencv倉庫,再從 gitee 上的倉庫下載就比較快了😁
二、使用opencv打開一張圖片
創建一個 test1.cpp 檔案:
#include<opencv2/opencv.hpp>
#include<math.h>
using namespace cv;
int main()
{
//像素操作
Mat src,dst;
src = imread("/home/helloworld/lena.jpeg");
if(src.empty())
{
printf("can not load image \n");
return 0;
}
namedWindow("input");//創建視窗
imshow("input",src);//顯示圖片
cvtColor(src, dst, COLOR_BGR2GRAY);//將圖片轉為灰度圖
namedWindow("output");
imshow("output",dst);
waitKey();
return 0;
}
此時發現如果用 "gcc test1.cpp -o test1 `pkg-config --cflags --libs opencv` "編譯會報如下錯誤,因為 gcc 主要是編譯 C程式的,此時應用 g++;如果用 g++ 編譯 C程式,它會直接呼叫 gcc 去編譯
g++ test1.cpp -o test1 `pkg-config --cflags --libs opencv`
那么上述命令是如何獲取 opencv 的頭檔案及鏈接lib庫的路徑的
–cflags:它是用來指定程式在編譯時所需要頭檔案所在的目錄
–libs:則是指定程式在鏈接時所需要的元件的目錄
具體說明請參考:pkg-config --cflags --libs
然后運行 ./test1 時,發現也會報錯:
此時,根據提示先安裝一下 “libgtk2.0-dev” 和 “pkg-config”,然后在重新 make 一下
sudo apt-get install libgtk2.0-dev
sudo apt-get install pkg-config
cd ~/opencv3.4.3/my_build_dir/
rm -rf *
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
sudo make -j4
sudo make install
注意,是進入自己安裝 opencv 的 build目錄
然后在重新在編譯運行一下,結果如下:
三、使用opencv打開攝像頭
a. 新建一個 test2.cpp 檔案
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
//從攝像頭讀取視頻
VideoCapture capture(0);
//回圈顯示每一幀
while (1)
{
Mat frame;//定義一個Mat變數,用于存盤每一幀的影像
capture >> frame;//讀取當前幀
imshow("讀取視頻幀", frame);//顯示當前幀
waitKey(30);//延時30ms
}
system("pause");
return 0;
}
注意:如果虛擬機沒有連接攝像頭,運行該程式則會報錯
查看虛擬機是否連接了攝像頭,看右下方的攝像頭是否點亮
沒有,則進行如下操作,點擊 “虛擬機 —> 設定 —> USB 控制器 —> 選擇 USB3.0”(一般情況都是選擇 “USB3.0”)
然后再連接攝像頭:
選擇自己的什么 “XXX Camera”
然后重新編譯運行 test2.cpp:
g++ test2.cpp -o test2 `pkg-config --cflags --libs opencv`
./test2
b. 代碼的說明:
-
Mat 是一個什么東東?
Mat是一個類,由兩部分資料組成:矩陣頭(包括矩陣尺寸、存盤方法、存盤地址等資訊)和一個指向所有像素值的矩陣(根據所選存盤方法不同,矩陣可以是不同的維數)的指標,
具體說明請參考:https://blog.csdn.net/zhu_hongji/article/details/79983508
-
為什么一定要加一句waitKey延時代碼,洗掉它行不行?
waitKey()–這個函式是在一個給定的時間內(單位ms)等待用戶按鍵觸發;如果用戶沒有按下 鍵,則接續等待(回圈),不能洗掉,一般在 imshow() 后要使用 waitKey(),給影像繪制留下時間,不然視窗會出現無回應情況,并且影像無法顯示出來,
具體說明請參考:OpenCV-Python學習之(一)waitKey()函式詳解
-
對代碼進行改進
test2.cpp會在while回圈中一直運行,你如果試圖用滑鼠關閉影像顯示視窗,會發現始終關不掉,需要用鍵盤Ctrl+C 強制中斷程式,那可不可以只需按一個鍵就可以退出程式吶?
答案是可以的,只需對 wiatKey() 函式做一次判斷即可
修改代碼如下(按"esc"鍵退出)
#include<opencv2/opencv.hpp> using namespace cv; int main() { //從攝像頭讀取視頻 VideoCapture capture(0); //回圈顯示每一幀 while (1) { Mat frame;//定義一個Mat變數,用于存盤每一幀的影像 capture >> frame;//讀取當前幀 imshow("讀取視頻幀", frame);//顯示當前幀 //waitKey(30);//延時30ms if(waitKey(30)==27) //按esc鍵退出 { break; } } system("pause"); return 0; }
四、使用opencv打開一個視頻檔案
a. 新建一個 test3.cpp 檔案
如何用 opencv 打開一個視頻檔案,只需把 test2.cpp 中 capture() 中的0換成視頻檔案的字串地址,如:"/home/helloworld/25.mp4"
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
//從攝像頭讀取視頻
VideoCapture capture("/home/helloworld/25.mp4");
//回圈顯示每一幀
while (1)
{
Mat frame;//定義一個Mat變數,用于存盤每一幀的影像
capture >> frame;//讀取當前幀
imshow("讀取視頻幀", frame);//顯示當前幀
waitKey(30);//延時30ms
}
system("pause");
return 0;
}
然而你又發現運行咋又報錯了啊,實驗不易啊😭,主要錯誤原因是因為沒有安裝ffmpeg;這還不容易直接 sudo apt-get install 就完了,然而你發現還是報同樣的錯,原因是再 opencv的 build目錄下 cmake 時,FFMPEG 依舊沒有打開😭
好吧,那就從頭再來過吧
b. 安裝 ffmpeg
-
支持庫的安裝
sudo apt-get install -y autoconf automake build-essential git libass-dev libfreetype6-dev libsdl2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo wget zlib1g-dev -
下載ffmpeg原始碼包,并將下載檔案移到 home 目錄下,解壓
unzip FFmpeg-release-3.4.zip -
進入解壓目錄
cd FFmpeg ./configure --disable-yasm --enbale-shared --prefix=/usr/local/ffmpeg -
編輯 profile 檔案(sudo vim /etc/profile)在檔案末尾添加:
export FFMPEG_HOME=/usr/local/ffmpeg export PATH=$FFMPEG_HOME/bin:$PATH然后執行 source /etc/profile
-
編輯 ld.so.conf 檔案 (sudo vim /etc/ld.so.conf) 在末尾添加:
/usr/local/ffmpeg/lib然后執行 sudo ldconfig -v
-
然后在重新去 opencv 的 build 目錄重新 make 一下,發現還是哪個樣子,opencv仍然無法執行讀取視頻操作
可能原因是:opencv的安裝無法檢測到ffmeg的pc檔案
解決辦法:將/usr/local/ffmpeg/lib/pkgconfig目錄下的pc檔案復制到 /usr/local/lib/pkgconfig目錄下,
sudo cp /usr/local/ffmpeg/lib/pkgconfig/lib* /usr/local/lib/pkgconfig -
回到 opencv的 build目錄中,重新再 make 一下
cd ~/opencv3.4.3/my_build_dir/ rm -rf * cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local .. sudo make -j4 sudo make install -
重新編譯運行 test3.cpp
g++ test3.cpp -o test3 `pkg-config --cflags --libs opencv` ./test3
五、通過攝像頭采集影像并壓縮成視頻
/*********************************************************************
打開電腦攝像頭,空格控制視頻錄制,ESC退出并保存視頻 video.mp4
*********************************************************************/
#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("video.mp4", 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;
}
編譯運行:
g++ test4.cpp -o test4 `pkg-config --cflags --libs opencv`
./test4
六、參考🔗
-
【嵌入式】Windows10&Ubantu16.04&樹莓派3B+安裝opencv教程
-
linux 正確安裝opencv解決無法讀取視頻的問題
-
ubuntu 安裝 ffmpeg程序中遇到的錯誤及解決方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/196438.html
標籤:其他
上一篇:千聊視頻可以下載到本地嗎?千聊視頻怎么下載?千聊視頻下載教程
下一篇:專案實戰:Qt流水線影像顯示控制元件(列重繪、1ms一次、縮放、拽拖、拽拖預覽、性能優化、支持OpenGL GPU加速)
