目录

  • 一、用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安装及示例相关推荐

  1. 用 gcc生成静态库和动态库以及静态库和动态库的使用

    文章目录 一.linux下gcc生成静态库和动态库以及库文件的使用 1.准备过程 2.静态库的创建及使用 (1)创建静态库 (2)程序中使用静态库 3.动态库的创建及使用 (1)创建动态库 (2)程序 ...

  2. gcc生成静态库和动态库,以及OpenCV3.4.11的安装和实例

    文章目录 一.用gcc生成静态库和动态库 (1).hello使用库实例 1.创建目录并编写hello代码 2.gcc编译得到.o文件 3.静态库的使用 4.动态库的使用 5.静态库与动态库的对比 (2 ...

  3. 用gcc生成静态库和动态库和使用opencv库编写打开摄像头压缩视频

    文章目录 一.用gcc生成静态库和动态库 1.编辑生成程序hello.h.hello.c.main.c 2.将hello.c生成.o文件 3.使用静态库 4.动态库的使用 二.a与.so库文件的生成与 ...

  4. GCC生成静态库和动态库

    目录 1)阅读.理解和学习材料"用gcc生成静态库和动态库.pdf"和"静态库.a与.so库文件的生成与使用.pdf",请在Linux系统(Ubuntu)下如实 ...

  5. Linux下用gcc生成静态库和动态库及练习使用OpenCV

    我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为 静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而 ...

  6. gcc生成静态库.a和动态库.so和OpenCV3.4.11的安装及使用示例

    gcc生成静态库.a和动态库.so和OpenCV3.4.11的安装及使用示例 文章目录 gcc生成静态库.a和动态库.so和OpenCV3.4.11的安装及使用示例 一.用gcc生成静态库和动态库 ( ...

  7. 用gcc生成静态库和动态库.pdf以及opencv的使用

    一.gcc生成动态库和静态库 1.准备过程 创建hello.h文件并编写hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *n ...

  8. linux库引入之动态库静态库(生成和使用)

    库: 库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容. 如何使用 用户需要同时具有头文件和库. ...

  9. go语言调用c 的头文件 so,Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a...

    Golang类似于C的静态语言,效率也接近于C,如果Golang也可以导出可供C调用的库,那可以和很多高级语言say goodbye了,goodbye似乎又有点武断,但至少说,Golang可以做很多事 ...

最新文章

  1. new com.mysql.jdbc.Driver()为什么Driver会创建两次
  2. Vivado生成bitstream报错,DRC NSTD-1与DRC UCIO-1]
  3. idea 执行 java jar_使用 Intellij Idea 打包 java 工程为可执行 jar 包-Go语言中文社区...
  4. ASP.NET Core 2.0 + EF6 + Linux +MySql混搭
  5. 如何在AWS中启动EC2实例
  6. 3-3 编程练习:jQuery键盘事件案例
  7. java中的异常处理代码,java_深入剖析Java中的各种异常处理方式,1. 调试追踪代码:public s - phpStudy...
  8. Maven—Eclipse设置Maven项目JDK版本
  9. 【CV】用于计算机视觉的 Transformer 高被引综述
  10. InfoGAN(Interpretable representation learning by information maximizing GAN)
  11. hprose php,hprose和swoole区别
  12. 电脑长时间睡眠会自动关机吗_电脑睡眠久了是不是自动关机
  13. VBA 工作簿和工作表的简单操作
  14. 如何批量去除视频水印教程
  15. Arduino与Proteus仿真实例-74HC573锁存器驱动仿真
  16. Spigot 算法之一 计算调和级数的和
  17. 手把手教你用Python画直方图
  18. 双重差分模型能做固定效应吗_双重差分法的平行趋势假定
  19. glib linux,如何升级glib呢?
  20. 王思聪 远程操控女主播“翻床”

热门文章

  1. MAC virtual box“不能为虚拟机启动一个新任务”问题解决方法
  2. css_使div中的文本自动换行
  3. java nul 字符_Java字符串替换和NUL(NULL,ASCII 0)字符?
  4. C++跳出for循环
  5. mysql table plugin,MySql报错Table mysql.plugin doesn’t exist的解决方法
  6. linux 中nohup命令的作用
  7. 2022-05-19 列式数据库-Clickhouse
  8. seek 方法java,Seek.java
  9. 简单易用的OKR工具——源目标OKR
  10. js html 乱码