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

Ubuntu下OpenCV3.4.11的初步使用

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

Ubuntu下OpenCV3.4.11的初步使用

目录

实验过程

一.图片

二.视频

1)虚拟机获取摄像头权限

2)播放视频

3)代码讲解

三.录制视频

总结

参考资料


实验过程

一.图片

首先创建一个代码存放文件夹 code ,然后进入文件夹中。

touch code
cd code

 创建一个 test1.cpp 文件。

gedit test1.cpp

#include 
#include 
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;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;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`

gcc编译器:gcc + 文件名 + -o + 输出文件流名称 +` 支持包


用 C++ 编译器编译你的接口模块。将 gcc 改为 g++ 后就正确了,可以看到有了可执行文件 test1 

 在用同文件夹下准备一张图片,文件名为:lena.jpg

输出结果:

执行以下命令:

./test1

可以看到由 lena.jpg 生成了一个 test.png 。

二.视频


1)虚拟机获取摄像头权限


使用快捷键 Win + R ,输入 services.msc ,并回车。

找到 VMware USB Arbitration S… 服务,确保启动了。


 

 点击 “ 虚拟机 ” ,然后点击 “ 设置(S)… ”。

选择 “ USB控制器 ” ,将 “ USB兼容性 ” 设置为 “ USB 3.0 ” ,并点击确定。


 


虚拟机右下角这个摄像头图标有个小绿点,则连接成功。

2)播放视频


创建一个 test2.cpp 文件。

gedit test2.cpp

将以下代码复制粘贴进去。
test2.cpp:

#include 
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;
}


3)代码讲解

        如果语句:VideoCapture capture(0),后面的参数设置为 0 ,则从摄像头读取视频并循环显示每一帧;如果设置为一个视频的文件名,比如:man.mp4 ,则会将视频读取并循环显示每一帧。
        while 循环体中的 Mat 数据结构其实是一个点阵,对应图像上的每一个点,点的集合形成了一帧图像,有关 Mat 详解请看:OpenCV中Mat数据结构
        语句:waitKey(30) ,中的参数单位是 ms 毫秒,也就是每一帧间隔 30 ms ,该语句时不能删除的,否则会执行错误,无法播放视频或录制视频。
准备一个小视频, man.mp4 。

  编译 test2.cpp 文件。

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

输出结果。

./test2

三.录制视频


创建一个 test3.cpp 。

gedit test3.cpp

代码
test3.cpp:

#include
#include 
#include
#include
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(cap.get(CV_CAP_PROP_frame_WIDTH));
    int h = static_cast(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

生成了一个 .avi 文件,并不断生成帧。

 

总结

ubantu下的opencv的使用不熟练,步骤多,代码难理解,在众多参考资料下艰难完成。还需多多学习。

参考资料

Ubuntu18.04下OpenCV3.4.11的安装及使用示例_ssj925319的博客-CSDN博客

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

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

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