在Ubuntu18.04系統下練習Opencv3.4.1
- 一、安裝Opencv3.4.1并配置依賴庫
- 二、編程使用opencv
- 三、opencv庫撰寫打開攝像頭壓縮視頻的程式的練習
- 1、打開攝像頭
- 2、修改程式
- 3、用opencv進行攝像
- 4、用opencv打開硬碟上一個視頻檔案
- 5、思考
- 四、總結
一、安裝Opencv3.4.1并配置依賴庫
- 官網下載Sources版本
- 將下載檔案復制到主目錄下

- 安裝依賴庫和cmake
輸入以下命令
sudo apt-get install cmake
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
- 安裝完cmake之后執行命令 ,創建編譯檔案夾,并進入檔案夾進行配置
mkdir my_build_dir
cd my_build_dir
輸入命令
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
執行結果:

輸入命令:
sudo make
開始安裝:

經過漫長的等待終于完成了

輸入命令:
sudo make install
- 執行完畢后,接下來就需要配置一些OpenCV的編譯環境首先將OpenCV的庫添加到路徑,從而可以讓系統找到
輸入命令:
sudo gedit /etc/ld.so.conf.d/opencv.conf
打開后是一個空白檔案,在里面輸入:
/usr/local/lib

- 保存回到命令列界面
- 執行如下命令使得剛才的配置路徑生效
sudo ldconfig
- 配置bash
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
- 在之前新建的目錄my_build_dir下新建test.cpp檔案
輸入命令:
touch test.cpp
打開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("abcd.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;
}

同時,把圖片放到與test.cpp檔案同一目錄下

- 保存輸入的代碼,并進行編譯:
g++ /test.cpp -o test `pkg-config --cflags --libs opencv`
./test
執行效果:

- 思考
注意gcc編譯命令:
gcc test1.cpp -o test1 `pkg-config --cflags --libs opencv`
它是如何獲得opencv頭檔案、鏈接lib庫檔案的路徑的?
執行結果:

答:pkg-config --cflags --libs opencv 這個是代表一個字串,通過這個地址來找到這個庫,–cflags用來指定程式在編譯時所需要頭檔案所在的目錄,–libs是指定程式在鏈接時所需要的元件的目錄,
三、opencv庫撰寫打開攝像頭壓縮視頻的程式的練習
1、打開攝像頭
- 新建并進入一個test1.c檔案
touch test1.c
vim test1.c
輸入以下代碼(此代碼是有一定問題的):
#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;
}
- 在編譯之前我們先把攝像頭連接到虛擬機

然后點擊是 - 開始編譯運行
g++ test1.c -o test1 `pkg-config --cflags --libs opencv`
./test1
執行結果:

我們可以看到沒有成功運行,報了一個錯,
不要慌,經過在百度一番查找,終于找到了解決方法


如果你是USB 2.0 則換成USB 3.0,若是USB 3.0 則換成USB 2.0,
- 再次編譯運行,攝像頭成功打開,但由于我們的代碼是有錯誤的,代碼會在while回圈中一直運行,所以點擊右上角的紅色×號并不能將攝像頭關閉,只能使用Ctrl+x來強行中斷程式,接下來我們對程式進行修改,

2、修改程式
在原代碼上的while回圈里加上以下代碼:
if(waitKey(30)==27) //按esc鍵退出,
{
break;
}
這樣就能按Esc來中斷回圈,從而關閉攝像頭了,

- 打開硬碟上一個視頻檔案來播放
3、用opencv進行攝像
- 創建test2.c
touch test2.c
輸入代碼:
#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();
}
g++ test2.c -o test2 `pkg-config --cflags --libs opencv`
./test2
運行后,空格鍵進行錄像,Esc結束錄像
視頻保存在mytest目錄下


4、用opencv打開硬碟上一個視頻檔案
我們只需將之前的test1.c代碼修改一下即可

編譯并運行:
g++ test1.c -o test1 `pkg-config --cflags --libs opencv`
./test1
結果:

5、思考
- 在第9行的while回圈中,Mat是一個什么資料結構? 為什么一定要加一句waitKey延時代碼,洗掉它行不行?
(1)Mat是一個類,由兩部分資料組成:矩陣頭(包括矩陣尺寸、存盤方法、存盤地址等資訊)和一個指向所有像素值的矩陣(根據所選存盤方法不同,矩陣可以是不同的維數)的指標,
(2)如果不加waitKey的話,讀取當前幀和顯示當前幀兩者交替過快,視頻就不能顯示,一下就會消失,所以不能洗掉,
四、總結
這次通過此次的學習,我學會了使用opencv,雖然在安裝和使用的程序中遇到了很多問題,每次遇到問題都會有一種挫敗感以及煩躁感,但是解決問題過后的喜悅也是巨大的;opencv是一個很有用的工具,在影像采集,人臉識別方面可以有一定的應用,很高興自己能學會如何使用它,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/198524.html
標籤:其他
上一篇:Java開發工程師學習日記(七)
