栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Ubuntu中关于opencv的安装及使用

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Ubuntu中关于opencv的安装及使用

文章目录
  • 一、安装opencv的准备工作
  • 二、安装opencv
  • 三、使用opencv进行图片的特效显示
  • 四、使用opencv对视频进行处理
  • 五、总结及参考


一、安装opencv的准备工作

1.安装cmake

sudo apt-get install cmake

2.安装依赖环境

sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev

在安装依赖环境时,我遇到了个问题,就是要求更换介质。
输入

cd ~
vim /etc/apt/sources.list

注释掉开头第一行,deb cdrom就行
然后更新一下

apt-get uodate

现在安装依赖环境应该就不会出现问题了。

二、安装opencv

1.下载opencv
链接: https://www.bzblog.online/wordpress/index.php/2020/03/09/opencvdownload
进入后选择需要的版本,点进去如下,下载最后一个压缩包。(建议下载3.4.xx版本的,下更新的版本安装容易出错)

解压前,将下载的文件复制的自己想要的目录下,再进行提取文件,也就是解压。

2.鼠标右击opencv-3.4.11,点击在终端打开,然后建立build文件夹并进入该文件夹

mkdir build
cd build

3.通过cmake安装opencv
输入以下代码:

sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

稍等一会儿,等停止后进行编译,在这有几种方法,主要体现在安装速度不一样。

可以使用sudo make -j 8 、sudo make -j4 、sudo make 
我这里使用了·sudo make ,避免线路多了出错。

接下来又是漫长的等待,直到安装到100%。

最后进行安装,输入下述代码

sudo make install

4.配置环境
打开/etc/ld.so.conf

sudo gedit /etc/ld.so.conf

在文件最后一行加上include /uer/local/lib。点击保存。此时显示有隐患,问题不大,不用管。

运行sudo ldconfig,
修改bash.bashrc文件

sudo ldconfig
sudo gedit /etc/bash.bashrc 

在文件末尾加入:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

然后输入

source /etc/bash.bashrc

最后检查一下

pkg-config opencv --modversion


这就安装成功了。

三、使用opencv进行图片的特效显示

1.创建一个text3文件夹,用于保存本次的文件。

mkdir text3
cd text3

2.进入文件夹后编写程序test.cpp。

#include
#include
using namespace cv;
using namespace std;

//功能:对图片进行特效处理并显示
int main(int argc,char **argv)
{
        CvPoint center;
        double scale=-3;

        IplImage *image=cvLoadImage("star.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;iheight;i++)
                for (int j = 0;jwidth;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;
        src=cvarrToMat(image);
        imwrite("test.png",src);
        imshow("test",src);

        cvWaitKey();
        return 0;
}

2.编译程序
使用命令

gcc test.cpp -o test `pkg-config --cflags --libs opencv`

此时会报错,改为

g++ test.cpp -o test `pkg-config --cflags --libs opencv`

这条命令通过命令pkg-config --cflags --libs opencv获取
反引号表示输出字符串,所以使用g++ test.cpp -o test pkg-config --cflags --libs opencv编译程序时首先会将pkg-config --cflags --libs opencv替换为如下的OpenCV头文件和库文件的路径,从而获取OpenCV头文件、链接lib库文件的路径。

使用./test后,运行结果如下。

四、使用opencv对视频进行处理

1.使用电脑摄像头读取视频并显示程序如下
video.cpp

#include
using namespace cv;

int main()
{
        char key;
        VideoCapture capture(0);                //从摄像头读取视频
        while(1)                                //循环显示每一帧形成视频
        {
                Mat frame;                      //定义Mat变量储存每一帧图像
                capture>>frame;                 //读取当前帧
                imshow("读取视频",frame);       //显示当前帧
                waitKey(30);                  //延时
        }
        return 0;
}

2.使用电脑摄像头录制视频程序
video_record.cpp

#include
#include
#include
#include
using namespace cv;
using namespace std;

int main()
{
        VideoCapture capture(0);        //打开电脑摄像头
        if (!capture.isOpened())
        {
                cout << "error" << endl;
                waitKey(0);
                return -1;
        }

        int w = static_cast(capture.get(CV_CAP_PROP_frame_WIDTH)); //获得capture的分辨率
        int h = static_cast(capture.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)
        {
                capture >> frame;
                key = waitKey(100);
                if (key == 32)                  //按下空格开始录制、暂停录制
                {
                        startOrStop =1-startOrStop;
                        if (startOrStop == 0)   flag = 1;       //可以来回切换
                }
                if (key == 27)  break;                  //按下 ESC 退出整个程序,保存视频文件到磁盘
                if (startOrStop == 0 && flag==1)
                {
                        writer << frame;
                        cout << "recording" << endl;
                }
                else if (startOrStop == 1 && flag==1)
                {
                        flag = 0;
                        cout << "pause recording" << endl;
                }
                imshow("picture", frame);
        }
        capture.release();
        writer.release();
        destroyAllWindows();
}

3.Ubuntu下使用摄像头
快捷键win+r打开运行,输入“services.msc”,回车。打开服务器
在服务器列表中,确保“VMware USB Arbitration Service”已打开。
虚拟机设置:
在虚拟机菜单栏中选择“虚拟机(M)”->选择“可移动设备”->选择“xxxx Camera”->选择“连接(断开与主机连接)”,设置完这项之后,虚拟机接管了笔记本摄像头。
在终端输入命令, 安装cheese
apt-get install cheese
输入命令cheese查看摄像头情况。
若无视频,在Vmware Workstation的“虚拟机”->“虚拟机设置”->“USB控制器”下,查看“USB兼容性”,如果当前是“USB2.0”就修改为“USB3.0”,反之就修改为“USB2.0”。然后再在“虚拟机”->“可移动设备”下重新连接Camera,cheese就可以正常出视频了。

4.1 如果要读取一个硬盘上的文件,就应将video.cpp中的 VideoCapture capture(0)改为 VideoCapture capture(”as.mp4")。
效果如下

4.2 在video.cpp的while循环中Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同,矩阵可以是不同的维数)的指针。
加入waitKey延时,这样便于刷新储存每一帧图像,不会造成视频卡顿之类的问题。如果不加入延时的话会导致视频显示窗口无法显示。
4.3 video代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终无法关掉。需要用键盘输入Ctrl+C强制中断程序,非常不友好。
可以在while循环里加入按键退出的代码如下(按q键退出)

key = waitKey(1) & 0xff;        //按q键退出
if(key == 'q') break;
五、总结及参考

难,就感觉难,很多东西都参考了网上的大神的教程。但是真的很有趣,过程中还是不可避免的问题多多,但处理了就会有较深刻的印象。努力学习吧,争取以后自己也能搞出来,并且还比较好。同时欢迎各位大神指点。
参考:
https://blog.csdn.net/public669/article/details/99044895
https://blog.csdn.net/qq_45237293/article/details/109391445
https://blog.csdn.net/ssj925319/article/details/109231145
https://blog.csdn.net/oXiaoXue123456789/article/details/107115584

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/308602.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号