返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ Opencv实现录制九宫格视频
  • 211
分享到

C++ Opencv实现录制九宫格视频

2024-04-02 19:04:59 211人浏览 安东尼
摘要

目录库的导入开启摄像头定义所需变量捕获图片并生成视频实现图片的抓取、转换与保存补充在项目开始之前,我的环境已配置完成,具体环境如何配置可参考网络教程。下面我们开始项目的实现 库的导入

项目开始之前,我的环境已配置完成,具体环境如何配置可参考网络教程。下面我们开始项目的实现

库的导入

#include<iOStream>
#include<OpenCV2/opencv.hpp>
#include<string.h>
using namespace std;
using namespace cv;

这就不多说了

开启摄像头

    Mat frame;
    Mat newframe;
    string outputVideoPath = "F:\\c++language\\robocon.avi";
    VideoCapture capture(0);
    int frame_width = capture.get(CAP_PROP_FRAME_WIDTH);
    int frame_height = capture.get(CAP_PROP_FRAME_HEIGHT);
    VideoWriter writer;

开始摄像头,并获取摄像头的像素高度与宽度

定义所需变量

    int num = 3;//原图片长宽皆被划分为三份,共划分成九份
    int stepwidth;//划分后单个图片的宽度
    int stepheight;//划分后的那个图片的高度
    int space = 5;//九宫格中每张图片的间隔

捕获图片并生成视频

	capture >> frame;
	stepwidth = frame.cols / num;
	stepheight = frame.rows / num;
	resize(frame, frame, Size(stepwidth * num, stepheight * num), 1, 1, INTER_LINEAR);

	newframe = Mat(Size(frame.cols + (num - 1) * space, frame.rows + (num - 1) * space), CV_8UC3, Scalar(255, 255, 255));//新画布的生成
	writer.open(outputVideoPath, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 10, Size(frame.cols + (num - 1) * space, frame.rows + (num - 1) * space));
	if (!capture.isOpened())
	{
		cout << "The camera cannot be opened" << endl;
	}

	if (!writer.isOpened())
	{
		cout << "The video cannot be saved" << endl;
	}

根据九宫格各张图片以及间隔的大小生成新的画布,用于存放新的九宫格图片

实现图片的抓取、转换与保存


	int count = 1;

	while (count <= 60)
	{
		capture >> frame;
		stepwidth = frame.cols / num;
		stepheight = frame.rows / num;
		resize(frame, frame, Size(stepwidth * num, stepheight * num), 1, 1, INTER_LINEAR);

		Mat newframe = Mat(Size(frame.cols + (num - 1) * space, frame.rows + (num - 1) * space), CV_8UC3, Scalar(255, 255, 255));
		
		int i = 0;
		int j = 0;
		for (i = 0; i < num; i++)
		{
			for (j=0; j < num; j++)
			{
				int x = stepwidth * j;
				int y = stepheight * i;

				frame(Rect(x, y, stepwidth, stepheight)).copyTo(newframe(Rect(x + space * j, y + space * i, stepwidth, stepheight)));

			}

		
		}	
		imshow("output", newframe);
		waiTKEy(100);

		writer << newframe;
		count += 1;
	}
}

视频以10帧的形式呈现,共60帧图片。

补充

当然OpenCV不仅可以实现录制九宫格视频,还能制作出九宫格拼图功能,下面是实现的示例代码,感兴趣的可以学习一下

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdlib.h>
#include <time.h> 

using namespace cv;
using namespace std;

Mat img = imread("C:\\picture\\aa.jpg");
int m = img.cols;//宽
int n = img.rows;//高
cv::Mat combine = cv::Mat::zeros(m, n, img.type());
Mat imgROI1 = combine(Rect(0, 0, m / 3, n / 3));
Mat imgROI2 = combine(Rect(m / 3, 0, m / 3, n / 3));
Mat imgROI3 = combine(Rect(m / 3 * 2, 0, m / 3, n / 3));
Mat imgROI4 = combine(Rect(0, n / 3, m / 3, n / 3));
Mat imgROI5 = combine(Rect(m / 3, n / 3, m / 3, n / 3));
Mat imgROI6 = combine(Rect(m / 3 * 2, n / 3, m / 3, n / 3));
Mat imgROI7 = combine(Rect(0, n / 3 * 2, m / 3, n / 3));
Mat imgROI8 = combine(Rect(m / 3, n / 3 * 2, m / 3, n / 3));
Mat imgROI9 = combine(Rect(m / 3 * 2, n / 3 * 2, m / 3, n / 3));
Mat a[10];
Mat imge[10];
int t = 0;
int first;
int second;
Mat temp;

int f(int xx, int yy);
void onMouseHandle(int event, int x, int y, int flags, void *param);


int main()

{

	
    //分割图像rect()
	imge[1] = img(Rect(0, 0, m / 3, n / 3));
	imge[2] = img(Rect(m / 3, 0, m / 3, n / 3));
	imge[3] = img(Rect(m / 3 * 2, 0, m / 3, n / 3));
	imge[4] = img(Rect(0, n / 3, m / 3, n / 3));
	imge[5] = img(Rect(m / 3, n / 3, m / 3, n / 3));
	imge[6] = img(Rect(m / 3 * 2, n / 3, m / 3, n / 3));
	imge[7] = img(Rect(0, n / 3 * 2, m / 3, n / 3));
	imge[8] = img(Rect(m / 3, n / 3 * 2, m / 3, n / 3));
	imge[9] = img(Rect(m / 3 * 2, n / 3 * 2, m / 3, n / 3));

	
	
	//生成随机数
	
	int i, j;
	int b[10];//存储获取到的随机数。
	int f[10] = { 0 };//存储是否获取到过。
	int nx = 1; //计数器。

	srand((unsigned)time(NULL));//设置随机数种子。

	while (nx < 10)
	{
		int my = rand() % 10; //获取一个0~9的随机数。
		if (f[my]||my==0) continue;//该数之前已经获取到过。
		b[nx++] = my;//将该数存入数组。
		f[my] = 1;//标记该数已经获取过。
	}
	for (i = 1; i <= 9; i++)
	{
		a[i] = imge[b[i]];
	}
	
	
	namedWindow("九宫格");
	
	resize(a[1], imgROI1, imgROI1.size());
	resize(a[2], imgROI2, imgROI2.size());
	resize(a[3], imgROI3, imgROI3.size());
	resize(a[4], imgROI4, imgROI4.size());
	resize(a[5], imgROI5, imgROI5.size());
	resize(a[6], imgROI6, imgROI6.size());
	resize(a[7], imgROI7, imgROI7.size());
	resize(a[8], imgROI8, imgROI8.size());
	resize(a[9], imgROI9, imgROI9.size());
	
	imshow("九宫格", combine);
	setMouseCallback("九宫格", onMouseHandle, (void*)&combine);
	
	// 等待6000 ms后窗口自动关闭

	waitKey(0);

	return 0;

}

int f(int xx, int yy)
{
	int s;

	if (xx + yy == 2)
	{
		s = 1;
	}
	if (xx + yy == 3 && xx > yy)
	{
		s = 2;
	}

	if (xx + yy == 4 && xx > yy)
	{
		s = 3;
	}
	if (xx + yy == 3 && xx < yy)
	{
		s = 4;
	}
	if (xx + yy == 4 && xx == yy)
	{
		s = 5;
	}
	if (xx + yy == 5 && xx > yy)
	{
		s = 6;
	}
	if (xx + yy == 4 && xx < yy)
	{
		s = 7;
	}
	if (xx + yy == 5 && xx < yy)
	{
		s = 8;
	}
	if (xx + yy == 6)
	{
		s = 9;
	}
	return s;
}
void onMouseHandle(int event, int x, int y, int flags, void *param)
{
	
	int xx ;
	int yy ;


	switch (event)
	{
	case CV_EVENT_LBUTTONDOWN ://左键单击
	{ 
		
		xx = x / (m / 3) + 1;
		yy = y / (n / 3) + 1;
		++t;
		if (t % 2 == 1)
		{
			first = f(xx, yy);
		}
		if (t % 2 == 0)
		{
			second = f(xx, yy);
			if (second == first + 3 || second == first - 3 || second == first + 1 || second == first - 1)
			{
				temp = a[first];
				a[first] = a[second];
				a[second] = temp;
				resize(a[1], imgROI1, imgROI1.size());
				resize(a[2], imgROI2, imgROI2.size());
				resize(a[3], imgROI3, imgROI3.size());
				resize(a[4], imgROI4, imgROI4.size());
				resize(a[5], imgROI5, imgROI5.size());
				resize(a[6], imgROI6, imgROI6.size());
				resize(a[7], imgROI7, imgROI7.size());
				resize(a[8], imgROI8, imgROI8.size());
				resize(a[9], imgROI9, imgROI9.size());
			}
		}
		imshow("九宫格", combine);
		
	}
	break;

	default:
		break;
}
}

到此这篇关于C++ Opencv实现录制九宫格视频的文章就介绍到这了,更多相关C++ Opencv九宫格视频内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ Opencv实现录制九宫格视频

本文链接: https://lsjlt.com/news/148684.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++ Opencv实现录制九宫格视频
    目录库的导入开启摄像头定义所需变量捕获图片并生成视频实现图片的抓取、转换与保存补充在项目开始之前,我的环境已配置完成,具体环境如何配置可参考网络教程。下面我们开始项目的实现 库的导入...
    99+
    2024-04-02
  • C++OpenCV实战之制作九宫格图像
    目录前言一、九宫格图像二、源码三、效果显示总结前言 本文将使用OpenCV C++ 制作九宫格图像。其实原理很简单,就是将一张图像均等分成九份。然后将这九个小块按一定间隔(九宫格效果...
    99+
    2024-04-02
  • C++ OpenCV怎么制作九宫格图像
    今天小编给大家分享一下C++ OpenCV怎么制作九宫格图像的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、九宫...
    99+
    2023-06-26
  • 怎么用Python生成九宫格视频
    这篇文章主要介绍“怎么用Python生成九宫格视频”,在日常操作中,相信很多人在怎么用Python生成九宫格视频问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Python生成九宫格视频”的疑惑有所帮助!...
    99+
    2023-06-16
  • iOS实现九宫格自动生成视图
    在移动开发里有相当多的时候需要使控件呈现九宫格格式的分布,最常见的如 图案解锁界面: 相册管理界面: 单独创建一个这样界面的步骤相当繁琐,要创建父视图用于控制每一个单独的控件,而...
    99+
    2022-05-28
    iOS 九宫格 视图
  • Android studio 九宫格显示 gridview 适配器实现九宫格
    Android studio 九宫格显示 gridview 适配器实现九宫格 显示效果 Index.xml Item.xml Ind...
    99+
    2022-06-06
    Android Studio studio gridview Android
  • JavaScript实现九宫格抽奖
    本文实例为大家分享了JavaScript实现九宫格抽奖的具体代码,供大家参考,具体内容如下 看到个抽奖案例,觉得还不错。就自己做了一个简单版本。 点击中间的开始,抽奖就会跑起来,速...
    99+
    2024-04-02
  • Android实现图片九宫格
    本文实例为大家分享了Android实现图片九宫格的具体代码,供大家参考,具体内容如下 九宫格分三类 实现的效果 具体实现 activity_main <xml v...
    99+
    2024-04-02
  • Android实现九宫格抽奖
    本文实例为大家分享了Android实现九宫格抽奖的具体代码,供大家参考,具体内容如下 package cq.cake.luckdraw; import android.graph...
    99+
    2024-04-02
  • 用C#绘制九宫格形式的图片
    目录方法一:图片上绘制直线方法二:切分绘制图片总结使用GDI+产生九宫格形式的图片,不考虑局部放大的功能。具体的方式如下: 方法一:图片上绘制直线   想到的最简...
    99+
    2024-04-02
  • Android 九宫格的实现方法
    1、xml代码: 代码如下:<xml version="1.0" encoding="utf-8">  <LinearLayout xmlns:an...
    99+
    2022-06-06
    方法 Android
  • Android RecyclerView实现九宫格效果
    RecyclerView更加优化的复用机制和方便实现UI效果,几乎替代Listview和GridView的使用。但是分割线的实现,需要自己继承ItemDecoration来绘制。 效...
    99+
    2024-04-02
  • java实现九宫格拼图游戏
    本文实例为大家分享了java实现九宫格拼图游戏的具体代码,供大家参考,具体内容如下 设计步骤:  先将框架构思出来,首先将拼图游戏的雏形实现,即一个界面,九个按钮,按钮上的...
    99+
    2024-04-02
  • Android 实现九宫格抽奖功能
    目录效果展示实现步骤 1.生成抽奖矩形:2.添加奖品图片:3.实现抽奖动画:4.实现动态设置参数:5.添加抽奖结果回调效果展示 实现步骤 1.生成抽奖矩形: 其中每个矩形的宽高相...
    99+
    2024-04-02
  • 怎么用CSS实现九宫格图
    本篇内容介绍了“怎么用CSS实现九宫格图”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下图是手Q吃喝玩乐&...
    99+
    2024-04-02
  • Java编写实现九宫格应用
    本文实例为大家分享了Java编写实现九宫格应用的具体代码,供大家参考,具体内容如下 在九宫格里面轮流画圈或叉,哪一方先在水平、竖直、或对角线上有三个子则胜出。 可在窗体中安排9个按钮...
    99+
    2024-04-02
  • jquery如何实现九宫格抽奖
    这篇文章主要介绍jquery如何实现九宫格抽奖,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!jquery实现九宫格抽奖的方法:1、创建好前端展示的代码;2、通过jquery代码“$("#lottery a&...
    99+
    2023-06-21
  • Android怎么实现九宫格解锁
    这篇文章主要介绍Android怎么实现九宫格解锁,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先理清一下逻辑,我们要做NxN的九宫格 下图是3x3的简单图例// -(--)-(--)-(--)-// -(--)-(...
    99+
    2023-05-30
    android
  • Android实现九宫格图案解锁
    本文实例为大家分享了Android实现九宫格图案解锁的具体代码,供大家参考,具体内容如下 前言:自定义了一个九宫格的VIew来绘制九宫格图案,实现了绘制图案解锁的功能。 效果图如下:...
    99+
    2024-04-02
  • 原生JavaScript实现九宫格抽奖
    本文实例为大家分享了JavaScript实现九宫格抽奖 的具体代码,供大家参考,具体内容如下 思路:通过移动背景颜色实现中奖信息,每一个方形元素,需要按顺序排列,加个延时器...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作