gcc生成靜態庫.a和動態庫.so和OpenCV3.4.11的安裝及使用示例
文章目錄
- gcc生成靜態庫.a和動態庫.so和OpenCV3.4.11的安裝及使用示例
- 一、用gcc生成靜態庫和動態庫
- (一)hello實體使用庫
- 1.準備程序
- 2. 靜態庫使用
- 3.動態庫的使用
- 4.靜態庫與動態庫比較
- (二)實體使用庫
- 1.代碼
- 2.靜態庫
- 3.動態庫
- 4.靜態庫與動態庫生成檔案比較
- 二、OpenCV3.4.11的安裝及使用示例
- (一)、認識 OpenCV
- (二)、安裝OpenCV
- 1)安裝包
- 2)配置環境
- (三)、使用示例——圖片
- (四)、使用示例——視頻
- 1)虛擬機獲取攝像頭權限
- 2)播放視頻
- 3)錄制視頻
- 三、總結
- 四、參考文獻:
一、用gcc生成靜態庫和動態庫
函式庫分為靜態庫和動態庫,
靜態庫
在程式編譯時會被連接到目標代碼中,程式運行是則不需要靜態庫的存在,
動態庫
在程式編譯時不會被連接到目標代碼中,而是程式運行時載入的,
兩者區別:前者是編譯連接的,后者是程式運行載入的,
(一)hello實體使用庫
1.準備程序
(1). 創建一個目錄
(2). hello代碼
hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif//HELLO_H
hello.c
#include<stdio.h>
void hello(const char *name)
{
printf("Hello %s\n",name);
}
main.c
#include"hello.h"
int main()
{
hello("everyone");
return 0;
}
(3). gcc編譯得到.o檔案
gcc -c hello.c

2. 靜態庫使用
(1)創建靜態庫
創建靜態庫的工具:ar
靜態庫檔案命名規范:以lib作為前綴,是.a檔案
ar -crv libmyhello.a hello.o

(2)程式中使用靜態庫
①gcc -o hello main.c -L. -lmyhello

②gcc main.c libmyhello.a -o hello

③先生成main.o gcc -c main.c
生成可執行檔案 gcc -o hello main.c libmyhello.a

(3)驗證靜態庫的特點
在刪掉靜態庫的情況下,運行可執行檔案,發現程式仍舊正常運行,表明靜態庫跟程式執行沒有聯系,同時,也表明靜態庫是在程式編譯的時候被連接到代碼中的,

3.動態庫的使用
(1). 創建動態庫
創建動態庫的工具:gcc
動態庫檔案命名規范:以lib作為前綴,是.so檔案
gcc -shared -fPIC -o libmyhello.so hello.o

(2). 在程式中執行動態庫
gcc -o hello main.c -L. -lmyhello或gcc main.c libmyhello.so -o hello
再運行可執行檔案hello,會出現錯誤

問題的解決方法:將libmyhello.so復制到目錄/usr/lib中,由于運行時,是在/usr/lib中找庫檔案的,
mv libmyhello.so /usr/lib


4.靜態庫與動態庫比較
gcc編譯得到.o檔案 gcc -c hello.c
創建靜態庫 ar -crv libmyhello.a hello.o
創建動態庫 gcc -shared -fPIC -o libmyhello.so hello.o
使用庫生成可執行檔案 gcc -o hello main.c -L. -lmyhello
執行可執行檔案 ./hello
————————————————
著作權宣告:本文為CSDN博主「HarrietLH」的原創文章,遵循CC 4.0 BY-SA著作權協議,轉載請附上原文出處鏈接及本宣告,
原文鏈接:https://blog.csdn.net/qq_43279579/article/details/109026927


(二)實體使用庫
1.代碼
sub1.c
float x2x(int a,int b)
{
float c=0;
c=a+b;
return c;
}
sub2.c
float x2y(int a,int b)
{
float c=0;
c=a/b;
return c;
}
sub.h
#ifndef SUB_H
#define SUB_H
float x2x(int a,int b);
float x2y(int a,int b);
#endif
main.c
#include<stdio.h>
#include"sub.h"
void main()
{
int a,b;
printf("Please input the value of a:");
scanf("%d",&a);
printf("Please input the value of b:");
scanf("%d",&b);
printf("a+b=%.2f\n",x2x(a,b));
printf("a/b=%.2f\n",x2y(a,b));
}
gcc -c sub1.c sub2.c

2.靜態庫
ar crv libsub.a sub1.o sub2.o
gcc -o main main.c libsub.a

3.動態庫
gcc -shared -fPIC -o libsub.so sub1.o sub2.o
gcc -o main main.c libsub.so

4.靜態庫與動態庫生成檔案比較
靜態庫

動態庫

通過比較發現靜態庫要比動態庫要小很多,生成的可執行檔案大小也存在較小的差別,
二、OpenCV3.4.11的安裝及使用示例
(一)、認識 OpenCV
開源計算機視覺(OpenCV)是一個主要針對實時計算機視覺的編程函式庫,
OpenCV的應用領域包括:
2D和3D功能工具包
運動估計
面部識別系統
手勢識別
人機互動
移動機器人
動作理解
物體識別
分割和識別
物體影像立體視覺:來自兩個攝像機的深度感知
運動中的結構(SFM)
運動跟蹤
增強現實
為了支持上述一些領域,OpenCV包括一個統計機器學習庫,其中包含:
提升(Boosting)
決策樹學習
梯度提升樹
期望最大化演算法
k最近鄰演算法
樸素貝葉斯分類器
人工神經網路
隨機森林
支持向量機(SVM)
深層神經網路(DNN)
(二)、安裝OpenCV
1)安裝包
①下載 OpenCV 3.4.11 資料包
國內快速下載地址:https://www.bzblog.online/wordpress/index.php/2020/03/09/opencvdownload/
直接在虛擬機中的瀏覽器下載

②解壓縮包
在解壓縮包之前,將 opencv-3.4.11.zip 復制到 home 檔案夾下,再解壓縮,

③使用 cmake 安裝 opencv
首先進入解壓后的檔案夾:opencv-3.4.11
cd opencv-3.4.11

在進入 root 用戶,并更新一下,
1| sudo su
2| sudo apt-get update

接著再執行這條命令安裝 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

再創建 build 檔案夾,
mkdir build

然后進入我們創建的檔案夾:build
cd build
使用 cmake 編譯引數,或者使用第二條默認引數,都可以的,
1 | cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local …
2 | cmake …


④使用 make 創建編譯
仍然是在 build 檔案夾下進行,
sudo make
注:單執行緒編譯:sudo make ,這會等待比較長的時間,如果你想更快編譯完,可以使用命令:sudo make -j4 ,而 -j4 表示使用 4 個執行緒進行編譯,
編譯完成
⑤安裝
sudo make install

安裝程序中沒有報錯,即可安裝完成,
2)配置環境
修改 opencv.conf 檔案,打開后的檔案是空的,添加 opencv 庫的安裝路徑:/usr/local/lib
sudo gedit /etc/ld.so.conf.d/opencv.conf

保存后會看到之前的警告資訊,不用擔心,正常情況,

更新系統共享鏈接庫
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

這下終于安裝成功了!!!
(三)、使用示例——圖片
首先創建一個代碼存放檔案夾 code ,然后進入檔案夾中,
1 | touch code
2 | cd code

創建一個 test1.cpp 檔案,
gedit test1.cpp

將下面的代碼復制粘貼進去,
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;
}
編譯檔案:
執行以下命令:
g++ test1.cpp -o test1
pkg-config --cflags --libs opencv

在用同檔案夾下準備一張圖片,檔案名為:lena.jpg

輸出結果:
執行以下命令:
./test1

可以看到由 lena.jpg 生成了一個 test.png ,呈現的效果不同了,

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

找到 VMware USB Arbitration S… 服務,確保啟動了,

點擊 “ 虛擬機 ” ,然后點擊 “ 設定(S)… ”,選擇 “ USB控制器 ” ,將 “ USB兼容性 ” 設定為 “ USB 3.1 ” (有些是設定為USB 3.0),并點擊確定,

選擇 “ 虛擬機 ” ,再選擇 “ 可移動設備 ” ,再選擇 “Camera” ,最后點擊 “ 連接 ” ,再彈出的視窗內點擊 “ 確定 ” ,這里不同的版本有不同的方法,具體版本可百度,
虛擬機右下角這個攝像頭圖示有個小綠點,則連接成功,

2)播放視頻
創建一個 test2.cpp 檔案,
gedit test2.cpp
將以下代碼復制粘貼進去,
test2.cpp:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
//從攝像頭讀取視頻
VideoCapture capture("man.mp4");
//回圈顯示每一幀
while(1){
Mat frame;//定義一個Mat變數,用于存盤每一幀的影像
capture >> frame;//讀取當前幀
if(frame.empty())//播放完畢,退出
break;
imshow("讀取視頻幀",frame);//顯示當前幀
waitKey(30);//掩飾30ms
}
system("pause");
return 0;
}
準備一個小視頻,我這里準備了 man.mp4 ,

編譯 test2.cpp 檔案,
g++ test2.cpp -o test2
pkg-config --cflags --libs opencv

輸出結果,
./test2
3)錄制視頻
創建一個 test3.cpp ,
gedit test3.cpp
復制粘貼一下代碼,
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;
}
編譯 test3.cpp 檔案,
g++ test3.cpp -o test3 pkg-config --cflags --libs opencv

輸出結果,
./test3

三、總結
本次作業使我了解了gcc生成靜態庫和動態庫的方法,在做的程序中也遇到了困難,通過網上各位大佬的幫助解決了,同時學會了在ubuntu下安裝OpenCV3.4.11,并使用它,學會了讀取圖片,視頻,并且學會了錄制視頻,對我幫助很大,
四、參考文獻:
https://blog.csdn.net/qq_43279579/article/details/109026927
https://blog.csdn.net/ssj925319/article/details/109231145
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/312232.html
標籤:其他
上一篇:部署時頁面未呈現






