ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Ubuntu下OpenCV3.4.11的初步使用

2021-10-12 20:32:41  阅读:229  来源: 互联网

标签:11 视频 test3 Mat int 录制 Ubuntu cpp OpenCV3.4


目录

实验过程

一.图片

二.视频

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

2)播放视频

3)代码讲解

三.录制视频

总结

参考资料


实验过程

一.图片

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

touch code
cd code

 创建一个 test1.cpp 文件。

gedit 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`

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


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<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;
}
/*********************************************************************
打开电脑摄像头,空格控制视频录制,ESC退出并保存视频RecordVideo.avi
*********************************************************************/


编译 test3.cpp 文件。

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

输出结果。

./test3

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

 

总结

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

参考资料

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

标签:11,视频,test3,Mat,int,录制,Ubuntu,cpp,OpenCV3.4
来源: https://blog.csdn.net/Fancy_white/article/details/120730357

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有