opencv实时录像+视频打码

实验软件

opencv-3.4.1、Visual Studio 2017、Ubuntu

opencv的相关配置

详情安装配置:https://blog.csdn.net/qq_38269799/article/details/80815385
配置时要将…\opencv\build\x64\vc15\bin目录下的3个dll动态链接库分别放在C:\Windows下的System32和SysWow64下

ubuntu的相关配置

详情安装配置:https://www.cnblogs.com/mypsq/p/6114824.html

1、 以下介绍vs+opencv下的录像并保存

代码段:

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

void main()
{
	VideoCapture capture(0);//如果是笔记本,0打开的是自带的摄像头,1 打开外接的相机  
	Mat img;
	VideoWriter vw;     //新建一个多媒体文件
	namedWindow("cam");

	int fps = capture.get(CAP_PROP_FPS*3); //获取摄像头的帧率
	if (fps <= 0)fps = 25;
	//设置视频的格式
	
	vw.open("out2.avi", VideoWriter::fourcc('x', '2', '6','4'),fps
	,Size(capture.get(CAP_PROP_FRAME_WIDTH),capture.get(CAP_PROP_FRAME_HEIGHT)));

	if (!capture.isOpened())   //判断摄像头是否打开
	{
		cout << "open video faild";
		getchar();
	}
	cout << "open video success" << endl;

	if (!vw.isOpened())     //判断视频文件是否创建
	{
		cout << "open vw faild" << endl;

	}
	cout << "open vw success" << endl;

	while (1)
	{
		capture.read(img);  //读取视频帧
		if (img.empty())
			break;
		imshow("cam", img); //显示视频帧
		vw.write(img);   //将视频帧写入文件

		if (waitKey(10) == ' q') //q键退出录制
			break;
	}
}

提醒:视频格式不同,可能录像不了。电脑性能不同,可能实时录像的帧率不同,也就会导致录像播放速度不正常现象。我的录像就很快,无语。

2、以下介绍Ubuntu+opencv对录像进行打码

长得太丑,来打个码,真好!

#include<opencv2/objdetect/objdetect.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

CascadeClassifier faceCascade;

int main()
{
    faceCascade.load("./opencv3.4.1/data/haarcascades/haarcascade_frontalface_alt2.xml");
    //网上说绝对路径,不成功,报错xml函数,!empty()出错。我改成相对路径,即ok。
       	VideoCapture capture;
        capture.open(0);
        capture.open("out2.avi");//导入的视频须明亮处。
        if(!capture.isOpened())
        {
          cout << "open camera failed. " << endl;
          return -1;
        }

    Mat img, imgGray;
    vector<Rect> faces;
        while(1)
        {
                capture >> img;
                if(img.empty())
                {
                        continue;
                }

                if(img.channels() == 3)
                {
                        cvtColor(img, imgGray, CV_RGB2GRAY);
                }
                else
                {
                        imgGray = img;
                }

            faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));
                if(faces.size()>0)
                {
                   for(int i =0; i<faces.size(); i++)
                   {
                           Mat faceROI = imgGray( faces[i] );
                           Mat faceOrg = img( faces[i] );
                           blur(faceOrg, faceOrg, Size(25,25));
                           std::vector<Rect> eyes;
                        //第三次成功,用园圈出人脸
                        //Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2); // 人脸中心坐标
                        //ellipse(img, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 0), 4, 8, 0); // 椭圆

                        //第二次检测出人脸
                          //rectangle(img,faces[i], Scalar(0, 0, 255), 1, 8); 
                          //
                          //第一次成功检测出人脸
                          rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + 
                          faces[i].width, faces[i].y + faces[i].height), Scalar(0, 0, 255), 1, 8);
                   }
                }

                imshow("CamerFace", img);
                if(waitKey(1) > 0)
                {
                        break;
                }
        }

    return 0;
}

在试验中,我遇到的问题有:
1.无ffmpeg库
2.加载不了录像帧
3.如何进行帧的人脸识别
4.如何对人脸进行打码。
我的处理:
1.sudo apt install ffmpeg,安装ffmpeg
2.将人脸识别的相关库用相对路径
3.作为小白的我,经常百度,百度是最好的老师

该我上场了!

opencv实时录像+视频打码_第1张图片

好了,我的首秀完成了。哪做的不好,还请多提建议。

  • 点赞
  • 加油

你可能感兴趣的:(计算机,物联网)