目錄
- 一、GDB簡單除錯
- 1、 安裝gdb
- 2、記憶體出錯的GDB除錯
- 二、安裝opencv-3.4.12
- 1、將在網上下載好的opencv-3.4.12拖進unbuntu并將其復制到主目錄下
- 2、打開終端解壓包
- 3、 進入到解壓后的檔案包中
- 4、 安裝依賴庫和cmake
- 5、創建編譯檔案夾
- 6、進行cmake
- 7、配置OpenCV的編譯環境
- 8、執行如下命令使得剛才的配置路徑生效
- 9、執行如下命令使得配置生效并更新
- 二、 Linux編程
- 1、在opencv-3.4.1下新建檔案夾mytest
- 2、創建test.cpp
- 3、進入編程
- 4、保存并編譯
- 5、運行結果
- 三、使用opencv庫撰寫打開攝像頭壓縮視頻的程式
- 1、先將虛擬機的usb控制器下的usn兼容改為3.0并連接攝像頭
- 2.創建檔案和編譯
- 3.編譯后運行結果
- 總結
一、GDB簡單除錯
1、 安裝gdb
sudo apt-get install gdb
2、記憶體出錯的GDB除錯
? Linux中,程式崩潰時,一般會產生core檔案,記錄行程退出前的狀態,除錯段錯誤問題,借助于該檔案,可快速定位問題,
? 可按如下步驟生成和使用core檔案
– Step 1: 讓系統產生core檔案
? ulimit –c num #設定core檔案容量(num為數字,為0 是不產生core檔案)
– Step 2: 運行程式,讓程式崩潰,從而生成core檔案
– Step 3: gdb配合core檔案,定位問題
? gdb 程式名 core檔案名
? 比如: gdb segDemo core
(1)創建并編譯

示例代碼:
#include<stdio.h>
int main(void)
{
int *p=0;
*p=1;
return 0;
}
gcc -o tao -g tao.c
(2)讓系統產生core檔案,并運行讓程式崩潰,從而產生core檔案
ulimit -c 100

(3)輸入gdb 檔案名 core找到檔案問題
gdb tao core
二、安裝opencv-3.4.12
1、將在網上下載好的opencv-3.4.12拖進unbuntu并將其復制到主目錄下

2、打開終端解壓包
unzip opencv-3.4.12.zip
3、 進入到解壓后的檔案包中
cd opencv-3.4.12
4、 安裝依賴庫和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
5、創建編譯檔案夾
mkdir my_build_dir
進入檔案夾進行配置
cd my_build_dir
6、進行cmake
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
執行命令
sudo make

sudo make install
7、配置OpenCV的編譯環境
將OpenCV的庫添加到路徑
sudo gedit /etc/ld.so.conf.d/opencv.conf
打開后輸入
/usr/local/lib

8、執行如下命令使得剛才的配置路徑生效
sudo ldconfig
配置bash
sudo gedit /etc/bash.bashrc
在最末尾添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

9、執行如下命令使得配置生效并更新
source /etc/bash.bashrc
sudo updatedb
二、 Linux編程
1、在opencv-3.4.1下新建檔案夾mytest
cd opencv-3.4.1
mkdir mytest
2、創建test.cpp
touch test.cpp
3、進入編程
sudo gedit /test.cpp
圖片路徑直接放在home目錄下;
#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;
}

4、保存并編譯
gcc -c test.cpp -o test `pkg-config --cflags --libs opencv`
5、運行結果
運行./test會出現

輸入命令即可
sudo apt-get install libcanberra-gtk-module
結果

三、使用opencv庫撰寫打開攝像頭壓縮視頻的程式
在上面的配置環境下進行
1、先將虛擬機的usb控制器下的usn兼容改為3.0并連接攝像頭

在可移動設備中點擊最后一個連接

2.創建檔案和編譯
touch a.cpp
gedit a.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;
}
```c
//獲得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.編譯后運行結果
g++ a.cpp -o a `pkg-config --cflags --libs opencv`
./a
開啟攝像頭

空格控制視頻錄制,ESC退出并保存視頻
總結
1)如果要求打開你硬碟上一個視頻檔案來播放,請問第5行代碼如何修改?
代碼:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
VideoCapture capture(0);
while(1)
{
Mat frame;
capture >> frame;
imshow("讀取視頻幀",frame);
waitKey(30);
}
system("pause");
return 0;
}
將第5行代碼改為
VideoCapture capture("你想播放的視頻的名字");
2)在第9行的while回圈中,Mat是一個什么資料結構? 為什么一定要加一句waitKey延時代碼,洗掉它行不行?
MAT是一個類由兩部分資料組成:矩陣頭(包括矩陣尺寸、存盤方法、存盤地址等資訊)和一個指向所有像素值的矩陣(根據所選存盤方法不同,矩陣可以是不同的維數)的指標,不能洗掉wajitKey不然時間太短視頻無法顯示,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/198521.html
標籤:其他
上一篇:Nginx虛擬主機 基于域名、IP、埠 都有什么區別呢?
下一篇:GFS分布式檔案系統
