gcc生成静态库.a和动态库.a以及Ubuntu18.04下opencv3.4.11安装及示例
目录
- 一、用gcc生成静态库和动态库
- (一)hello示例使用库
- 1.准备过程
- 2.静态库使用
- 3.动态库的使用
- 4.静态库与动态库比较
- (二)示例1使用库
- 二.opencv安装以及使用
- (一)认识opencv
- (二)安装opencv
- (三)使用示例---图片
- (四)使用示例---视频
- (五)录制视频
- 三.总结
- 四.参考资料
一、用gcc生成静态库和动态库
函数库分为静态库和动态库
静态库:在程序编译时会被连接到目标代码中,程序运行是则不需要静态库的存在
动态库:在程序编译时不会被连接到目标代码中,而是程序运行时载入的。
两者区别:前者是编译连接的,后者是程序运行载入的
(一)hello示例使用库
1.准备过程
创建以下文件并编写,代码如下
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;
}
通过gcc编译得到.o文件
2.静态库使用
(1)创建静态库
(2)程序中使用静态库
(3)验证静态库的特点
在删掉静态库的情况下,运行可执行文件,发现程序仍旧正常运行,表明静态库跟程序执行没有联系。同时,也表明静态库是在程序编译的时候被连接到代码中的。
3.动态库的使用
(1)创建动态库
(2)在程序中执行动态库
再运行可执行文件hello,会出现错误,问题的解决方法:将libmyhello.so复制到目录/usr/lib中。由于运行时,是在/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
(二)示例1使用库
创建并编写一下文件
A1.c
#include<stdio.h>
void print1(int arg)
{printf("A1 print arg:%d\n",arg);
}
A2.c
#include<stdio.h>
void print2(char *arg)
{printf("A2 printf arg:%s\n",arg);
}
A.h
#ifndef A_H
#define A_H
void print1(int);
void print2(char *);
#endif
test.c
#include<stdio.h>
#include"A.h"
int main()
{print1(1);print2("test");exit(0);
}
操作如下
1.程序中使用静态库
2.动态库的使用
二.opencv安装以及使用
(一)认识opencv
开源计算机视觉(OpenCV)是一个主要针对实时计算机视觉的编程函数库。
OpenCV的应用领域包括:
2D和3D功能工具包
运动估计
面部识别系统
手势识别
人机交互
移动机器人
动作理解
物体识别
分割和识别
实体影像立体视觉:来自两个摄像机的深度感知
运动中的结构(SFM)
运动跟踪
增强现实
为了支持上述一些领域,OpenCV包括一个统计机器学习库,其中包含:
提升(Boosting)
决策树学习
梯度提升树
期望最大化算法
k最近邻算法
朴素贝叶斯分类器
人工神经网络
随机森林
支持向量机(SVM)
深层神经网络(DNN)
(二)安装opencv
下载opencv3.4.11 数据包
国内下载网址:https://www.bzblog.online/wordpress/index.php/2020/03/09/opencvdownload/
接下来把opencv-3.4.11.zip复制到home文件夹下,在解压缩
(1)输入:unzip opencv-3.4.11.zip
(2)进入解压下的文件下:opencv-3.4.11 在终端输入cd opencv-3.4.11
(3)输入:sudo su
sudo apt-get update
(4)输入:sudo apt-get install cmake
(5)输入:sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
(6)输入:mkdir build
(7)输入:cd build
(8)输入:cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local …
cmake …
(9)输入:sudo make
(10)输入:sudo make install
(11)输入:sudo gedit /etc/ld.so.conf.d/opencv.conf
(12)输入:sudo ldconfig
(13)配置 bash ,修改 bash.bashrc 文件,输入 :sudo gedit /etc/bash.bashrc,在文件末加入:PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH ,保存退出
(14)输入:source /etc/bash.bashrc
(15)输入:sudo updatedb
(16)输入pkg-config --modversion opencv,查看版本信息
安装成功!
(三)使用示例—图片
创建一个文件夹命名code,进入文件夹
打开终端,创建一个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
就可以看到两张图片不一样的呈现效果了
(四)使用示例—视频
首先的在虚拟机上获取摄像头权限,不同虚拟机方法不同。
接下来,播放视频
创建一个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
(五)录制视频
创建一个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;
}
编译文件:g++ test3.cpp -o test3 pkg-config --cflags --libs opencv
输出结果:./test3
三.总结
通过静态库和动态库的比较与练习,能够区分两者的区别。安装opencv是要耐心,在opencv中我们接触到了摄像监控等,还可以用到人脸识别等。
四.参考资料
1.https://blog.csdn.net/qq_43279579/article/details/109026927
2.https://blog.csdn.net/ssj925319/article/details/109231145
gcc生成静态库.a和动态库.a以及Ubuntu18.04下opencv3.4.11安装及示例相关推荐
- 用 gcc生成静态库和动态库以及静态库和动态库的使用
文章目录 一.linux下gcc生成静态库和动态库以及库文件的使用 1.准备过程 2.静态库的创建及使用 (1)创建静态库 (2)程序中使用静态库 3.动态库的创建及使用 (1)创建动态库 (2)程序 ...
- gcc生成静态库和动态库,以及OpenCV3.4.11的安装和实例
文章目录 一.用gcc生成静态库和动态库 (1).hello使用库实例 1.创建目录并编写hello代码 2.gcc编译得到.o文件 3.静态库的使用 4.动态库的使用 5.静态库与动态库的对比 (2 ...
- 用gcc生成静态库和动态库和使用opencv库编写打开摄像头压缩视频
文章目录 一.用gcc生成静态库和动态库 1.编辑生成程序hello.h.hello.c.main.c 2.将hello.c生成.o文件 3.使用静态库 4.动态库的使用 二.a与.so库文件的生成与 ...
- GCC生成静态库和动态库
目录 1)阅读.理解和学习材料"用gcc生成静态库和动态库.pdf"和"静态库.a与.so库文件的生成与使用.pdf",请在Linux系统(Ubuntu)下如实 ...
- Linux下用gcc生成静态库和动态库及练习使用OpenCV
我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为 静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而 ...
- gcc生成静态库.a和动态库.so和OpenCV3.4.11的安装及使用示例
gcc生成静态库.a和动态库.so和OpenCV3.4.11的安装及使用示例 文章目录 gcc生成静态库.a和动态库.so和OpenCV3.4.11的安装及使用示例 一.用gcc生成静态库和动态库 ( ...
- 用gcc生成静态库和动态库.pdf以及opencv的使用
一.gcc生成动态库和静态库 1.准备过程 创建hello.h文件并编写hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *n ...
- linux库引入之动态库静态库(生成和使用)
库: 库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容. 如何使用 用户需要同时具有头文件和库. ...
- go语言调用c 的头文件 so,Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a...
Golang类似于C的静态语言,效率也接近于C,如果Golang也可以导出可供C调用的库,那可以和很多高级语言say goodbye了,goodbye似乎又有点武断,但至少说,Golang可以做很多事 ...
最新文章
- new com.mysql.jdbc.Driver()为什么Driver会创建两次
- Vivado生成bitstream报错,DRC NSTD-1与DRC UCIO-1]
- idea 执行 java jar_使用 Intellij Idea 打包 java 工程为可执行 jar 包-Go语言中文社区...
- ASP.NET Core 2.0 + EF6 + Linux +MySql混搭
- 如何在AWS中启动EC2实例
- 3-3 编程练习:jQuery键盘事件案例
- java中的异常处理代码,java_深入剖析Java中的各种异常处理方式,1. 调试追踪代码:public s - phpStudy...
- Maven—Eclipse设置Maven项目JDK版本
- 【CV】用于计算机视觉的 Transformer 高被引综述
- InfoGAN(Interpretable representation learning by information maximizing GAN)
- hprose php,hprose和swoole区别
- 电脑长时间睡眠会自动关机吗_电脑睡眠久了是不是自动关机
- VBA 工作簿和工作表的简单操作
- 如何批量去除视频水印教程
- Arduino与Proteus仿真实例-74HC573锁存器驱动仿真
- Spigot 算法之一 计算调和级数的和
- 手把手教你用Python画直方图
- 双重差分模型能做固定效应吗_双重差分法的平行趋势假定
- glib linux,如何升级glib呢?
- 王思聪 远程操控女主播“翻床”
热门文章
- MAC virtual box“不能为虚拟机启动一个新任务”问题解决方法
- css_使div中的文本自动换行
- java nul 字符_Java字符串替换和NUL(NULL,ASCII 0)字符?
- C++跳出for循环
- mysql table plugin,MySql报错Table mysql.plugin doesn’t exist的解决方法
- linux 中nohup命令的作用
- 2022-05-19 列式数据库-Clickhouse
- seek 方法java,Seek.java
- 简单易用的OKR工具——源目标OKR
- js html 乱码