C# OpenCvSharp 模拟生成车辆运行视频

C# OpenCvSharp 模拟生成车辆运行视频

目录

效果

项目

代码

下载


效果

项目

代码

using OpenCvSharp;
using OpenCvSharp.Extensions;
using System;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;

namespace OpenCvSharp_Demo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string image_path;

        Stopwatch stopwatch = new Stopwatch();

        private void Form1_Load(object sender, EventArgs e)
        {
            image_path = "bg_img.jpg";
            pictureBox1.Image = new Bitmap(image_path);
        }

        Mat bgImg;
        Mat car_bgra;
        Mat car;
        Mat mask;
        Rect roi;
        Mat pos;
        int x, y, width, height, step;

        private void button6_Click(object sender, EventArgs e)
        {
            x = Convert.ToInt32(txtX.Text);
            y = Convert.ToInt32(txtY.Text);
            width = Convert.ToInt32(txtW.Text);
            height = Convert.ToInt32(txtH.Text);

            Cv2.Resize(mask, mask, new OpenCvSharp.Size(width, height));
            Cv2.Resize(car, car, new OpenCvSharp.Size(width, height));

            textBox1.Text = string.Format("x={0};y={1}", x, y);

            ShowCar();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            step = Convert.ToInt32(txtStep.Text);
            y = y + step;
            ShowCar();
        }

        private void button7_Click(object sender, EventArgs e)
        {
            step = Convert.ToInt32(txtStep.Text);
            x = x - step;
            ShowCar();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            step = Convert.ToInt32(txtStep.Text);
            y = y - step;
            ShowCar();
        }

        VideoCapture capture;
        Mat currentFrame = new Mat();
        private void button8_Click(object sender, EventArgs e)
        {
            capture = new VideoCapture("out.mp4");

            if (!capture.IsOpened())
            {
                MessageBox.Show("打开视频文件失败");
                return;
            }
            capture.Read(currentFrame);
            if (!currentFrame.Empty())
            {
                pictureBox1.Image = BitmapConverter.ToBitmap(currentFrame);
                timer1.Interval = (int)(1000.0 / capture.Fps);
                timer1.Enabled = true;
            }

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            capture.Read(currentFrame);
            if (currentFrame.Empty())
            {
                //pictureBox1.Image = null;
                timer1.Enabled = false;
                capture.Release();
                textBox1.Text = "播放完毕。";
                return;
            }
            pictureBox1.Image = BitmapConverter.ToBitmap(currentFrame);
        }

        bool ShowCar()
        {

            textBox1.Text = string.Format("x={0};y={1};width={2};height={3}", x, y, width, height);
            txtX.Text = x.ToString();
            txtY.Text = y.ToString();
            txtW.Text = width.ToString();
            txtH.Text = height.ToString();

            roi = new Rect(x, y, width, height);

            if (x < 0)
            {
                x = 0;
                textBox1.Text = "位置越界";
                return false;
            }

            if (y < 0)
            {
                y = 0;
                textBox1.Text = "位置越界";
                return false;
            }

            bgImg = Cv2.ImRead(image_path, ImreadModes.Color);

            if (roi.Bottom > bgImg.Height)
            {
                textBox1.Text = "位置越界";
                bgImg.Dispose();
                return false;
            }

            if (roi.Right > bgImg.Width)
            {
                textBox1.Text = "位置越界";
                bgImg.Dispose();
                return false;
            }

            pos = new Mat(bgImg, roi);
            car.CopyTo(pos, mask);
            pictureBox2.Image = new Bitmap(bgImg.ToMemoryStream());

            pos.Dispose();
            bgImg.Dispose();

            return true;

        }

        private void button3_Click(object sender, EventArgs e)
        {
            step = Convert.ToInt32(txtStep.Text);
            x = x + step;
            ShowCar();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            bgImg = Cv2.ImRead(image_path, ImreadModes.Color);
            car_bgra = Cv2.ImRead("car1.png", ImreadModes.Unchanged);
            car = Cv2.ImRead("car1.png", ImreadModes.Color);
            //透明图
            //B,G,R,A   B,G,R -> 0 黑色 255 白色
            //A为透明度 -> 255为不透明,0为全透。
            var alphaBgr = Cv2.Split(car_bgra);
            mask = alphaBgr[3];

            x = 0;
            y = 0;
            width = car.Cols;
            height = car.Rows;

            ShowCar();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            x = 1120;
            y = 0;
            width = 400;
            height = 400;

            Cv2.Resize(mask, mask, new OpenCvSharp.Size(width, height));
            Cv2.Resize(car, car, new OpenCvSharp.Size(width, height));
            Cv2.Resize(car_bgra, car_bgra, new OpenCvSharp.Size(width, height));
            bgImg = Cv2.ImRead(image_path, ImreadModes.Color);

            VideoWriter vwriter = new VideoWriter("out.mp4", FourCC.X264, 30, new OpenCvSharp.Size(bgImg.Width, bgImg.Height));

            int count = 0;
            for (int i = 0; i < 200; i++)
            {
                y = y + 10;

                width = width + 2;
                height = height + 2;

                car_bgra = Cv2.ImRead("car1.png", ImreadModes.Unchanged);
                car = Cv2.ImRead("car1.png", ImreadModes.Color);

                Cv2.Resize(car_bgra, car_bgra, new OpenCvSharp.Size(width, height));
                Cv2.Resize(car, car, new OpenCvSharp.Size(width, height));

                var alphaBgr = Cv2.Split(car_bgra);
                mask = alphaBgr[3];

                roi = new Rect(x, y, width, height);

                if (roi.Bottom > bgImg.Height)
                {
                    textBox1.Text = "位置越界";
                    break;
                }

                if (roi.Right > bgImg.Width)
                {
                    textBox1.Text = "位置越界";
                    break;
                }

                bgImg = Cv2.ImRead(image_path, ImreadModes.Color);
                pos = new Mat(bgImg, roi);
                car.CopyTo(pos, mask);

                Cv2.ImWrite("out/" + i + ".jpg", bgImg);
                vwriter.Write(bgImg);
                count++;
                //pos.Dispose();
                //bgImg.Dispose();
            }
            pictureBox2.Image = new Bitmap(bgImg.ToMemoryStream());

            //Cv2.ImWrite("result.jpg", bgImg);
            //double costTime = stopwatch.Elapsed.TotalMilliseconds;
            //textBox1.Text = $"耗时:{costTime:F2}ms";
            textBox1.Text = "生成完毕!count=" + count.ToString();
            textBox1.Text += string.Format("x={0};y={1};width={2};height={3}", x, y, width, height);
            vwriter.Release();
        }
    }
}

using OpenCvSharp;
using OpenCvSharp.Extensions;
using System;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;namespace OpenCvSharp_Demo
{public partial class Form1 : Form{public Form1(){InitializeComponent();}string image_path;Stopwatch stopwatch = new Stopwatch();private void Form1_Load(object sender, EventArgs e){image_path = "bg_img.jpg";pictureBox1.Image = new Bitmap(image_path);}Mat bgImg;Mat car_bgra;Mat car;Mat mask;Rect roi;Mat pos;int x, y, width, height, step;private void button6_Click(object sender, EventArgs e){x = Convert.ToInt32(txtX.Text);y = Convert.ToInt32(txtY.Text);width = Convert.ToInt32(txtW.Text);height = Convert.ToInt32(txtH.Text);Cv2.Resize(mask, mask, new OpenCvSharp.Size(width, height));Cv2.Resize(car, car, new OpenCvSharp.Size(width, height));textBox1.Text = string.Format("x={0};y={1}", x, y);ShowCar();}private void button5_Click(object sender, EventArgs e){step = Convert.ToInt32(txtStep.Text);y = y + step;ShowCar();}private void button7_Click(object sender, EventArgs e){step = Convert.ToInt32(txtStep.Text);x = x - step;ShowCar();}private void button1_Click(object sender, EventArgs e){step = Convert.ToInt32(txtStep.Text);y = y - step;ShowCar();}VideoCapture capture;Mat currentFrame = new Mat();private void button8_Click(object sender, EventArgs e){capture = new VideoCapture("out.mp4");if (!capture.IsOpened()){MessageBox.Show("打开视频文件失败");return;}capture.Read(currentFrame);if (!currentFrame.Empty()){pictureBox1.Image = BitmapConverter.ToBitmap(currentFrame);timer1.Interval = (int)(1000.0 / capture.Fps);timer1.Enabled = true;}}private void timer1_Tick(object sender, EventArgs e){capture.Read(currentFrame);if (currentFrame.Empty()){//pictureBox1.Image = null;timer1.Enabled = false;capture.Release();textBox1.Text = "播放完毕。";return;}pictureBox1.Image = BitmapConverter.ToBitmap(currentFrame);}bool ShowCar(){textBox1.Text = string.Format("x={0};y={1};width={2};height={3}", x, y, width, height);txtX.Text = x.ToString();txtY.Text = y.ToString();txtW.Text = width.ToString();txtH.Text = height.ToString();roi = new Rect(x, y, width, height);if (x < 0){x = 0;textBox1.Text = "位置越界";return false;}if (y < 0){y = 0;textBox1.Text = "位置越界";return false;}bgImg = Cv2.ImRead(image_path, ImreadModes.Color);if (roi.Bottom > bgImg.Height){textBox1.Text = "位置越界";bgImg.Dispose();return false;}if (roi.Right > bgImg.Width){textBox1.Text = "位置越界";bgImg.Dispose();return false;}pos = new Mat(bgImg, roi);car.CopyTo(pos, mask);pictureBox2.Image = new Bitmap(bgImg.ToMemoryStream());pos.Dispose();bgImg.Dispose();return true;}private void button3_Click(object sender, EventArgs e){step = Convert.ToInt32(txtStep.Text);x = x + step;ShowCar();}private void button2_Click(object sender, EventArgs e){bgImg = Cv2.ImRead(image_path, ImreadModes.Color);car_bgra = Cv2.ImRead("car1.png", ImreadModes.Unchanged);car = Cv2.ImRead("car1.png", ImreadModes.Color);//透明图//B,G,R,A   B,G,R -> 0 黑色 255 白色//A为透明度 -> 255为不透明,0为全透。var alphaBgr = Cv2.Split(car_bgra);mask = alphaBgr[3];x = 0;y = 0;width = car.Cols;height = car.Rows;ShowCar();}private void button4_Click(object sender, EventArgs e){x = 1120;y = 0;width = 400;height = 400;Cv2.Resize(mask, mask, new OpenCvSharp.Size(width, height));Cv2.Resize(car, car, new OpenCvSharp.Size(width, height));Cv2.Resize(car_bgra, car_bgra, new OpenCvSharp.Size(width, height));bgImg = Cv2.ImRead(image_path, ImreadModes.Color);VideoWriter vwriter = new VideoWriter("out.mp4", FourCC.X264, 30, new OpenCvSharp.Size(bgImg.Width, bgImg.Height));int count = 0;for (int i = 0; i < 200; i++){y = y + 10;width = width + 2;height = height + 2;car_bgra = Cv2.ImRead("car1.png", ImreadModes.Unchanged);car = Cv2.ImRead("car1.png", ImreadModes.Color);Cv2.Resize(car_bgra, car_bgra, new OpenCvSharp.Size(width, height));Cv2.Resize(car, car, new OpenCvSharp.Size(width, height));var alphaBgr = Cv2.Split(car_bgra);mask = alphaBgr[3];roi = new Rect(x, y, width, height);if (roi.Bottom > bgImg.Height){textBox1.Text = "位置越界";break;}if (roi.Right > bgImg.Width){textBox1.Text = "位置越界";break;}bgImg = Cv2.ImRead(image_path, ImreadModes.Color);pos = new Mat(bgImg, roi);car.CopyTo(pos, mask);Cv2.ImWrite("out/" + i + ".jpg", bgImg);vwriter.Write(bgImg);count++;//pos.Dispose();//bgImg.Dispose();}pictureBox2.Image = new Bitmap(bgImg.ToMemoryStream());//Cv2.ImWrite("result.jpg", bgImg);//double costTime = stopwatch.Elapsed.TotalMilliseconds;//textBox1.Text = $"耗时:{costTime:F2}ms";textBox1.Text = "生成完毕!count=" + count.ToString();textBox1.Text += string.Format("x={0};y={1};width={2};height={3}", x, y, width, height);vwriter.Release();}}
}

下载

源码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/329018.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海外云手机的运作原理和适用场景

海外云手机是一种基于云计算技术的虚拟手机服务&#xff0c;通过将手机操作系统和应用程序托管在远程服务器上&#xff0c;实现用户可以通过互联网连接来使用和管理手机功能&#xff0c;而无需实际拥有物理手机。以下是有关海外云手机的相关信息&#xff1a; 海外云手机的运作原…

树莓派3B+入门(无外设)

昨日刚到一块树莓派3B&#xff0c;甚是喜爱&#xff0c;然半宿未眠 1、下载 在官网先下载烧录文件https://www.raspberrypi.com/software/ 下载完毕打开&#xff0c;选择&#xff0c;根据自己板子型号定 操作系统用最新的就行&#xff0c;64位不太稳定 储存卡&#xff0c;需…

超声波清洗机哪家好一点?四款超一流超声波清洗机大盘点

在追求极致清洁和维护精密工具、设备及珍贵物品的时代&#xff0c;超声波清洗机显得尤为重要。不仅因其高效、快速的清洁效果&#xff0c;更因其能够触及传统手工清洁所不能及的微小缝隙。无论你是珠宝设计师、机械工程师、还是热爱生活的普通家庭用户&#xff0c;超声波清洗机…

C语言例题43、打印倒立金字塔

#include <stdio.h>void main() {int i, j;for (i 5; i > 0; i--) {for (j 5; j > i; j--) {//输出空格printf(" ");}for (j 2 * i; j > 1; j--) {//输出星号printf("* ");}printf("\n");} }运行结果&#xff1a; 本章C语言…

【高阶数据结构(四)】图的最短路径问题

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:高阶数据结构专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多数据结构   &#x1f51d;&#x1f51d; 高阶数据结构 1. 前言2. 单源最短…

基于springboot实现大学生就业需求分析系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现大学生就业需求分析系统演示 摘要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲…

移动端适配(rem,vw)+响应式布局

1.1视口标签&#xff08;逻辑分辨率和设备匹配&#xff09; 1.2二倍图&#xff08;防止失真&#xff09; 二、适配方案 一、rem 1.1媒体查询 1.2、引入js文件&#xff08;remflexble.js&#xff09; 1.2、less Less 是一种动态样式语言&#xff0c;它扩展了 CSS 的功能&#…

sklearn之线性回归——以上证红利指数为例

文章目录 线性回归概念使用sklearn实现上证中立指数预测内置数据集的加载与处理 外部数据集的加载和处理数据内容数据加载和处理 开始预测分割数据集导入线性回归模型查看线性回归模型的系数绘制预测结果预测效果评估 最终代码 线性回归 线性回归&#xff08;Linear Regressio…

大数据比赛-环境搭建(二)

一、ubuntu安装google 1、下载google的Linux安装版 链接&#xff1a;https://pan.baidu.com/s/1w4Hsa1wbJDfC95fX2vU_1A 提取码&#xff1a;xms6 或者&#xff1a;Google Chrome 64bit Linux版_chrome浏览器,chrome插件,谷歌浏览器下载,谈笑有鸿儒 (chromedownloads.net) …

AI办公自动化:用kimi批量把word转换成txt文本

在Kimichat中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个Python脚本编写的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;F:\aword 读取里面docx格式的word文档&#xff0c; 提取word文档中的第一行文字作为txt文本文档的标题…

【Python】使用requests采集数据存入mysql或文件

一、什么是requests requests包是一个使用Python编写的HTTP请求库&#xff0c;使得发送HTTP请求和处理HTTP响应变得更加简单。以下是对requests包的详细介绍&#xff1a; 用途&#xff1a; requests包主要用于与HTTP交互&#xff0c;能够发送HTTP请求和处理HTTP响应。它支持处…

软考--试题六--抽象工厂模式(Abstract Factory)

抽象工厂模式(Abstract Factory) 意图 提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无须指定他们具体的类 结构 适用性 1、一个系统要独立于它的产品的创建、组合和表示时 2、一个系统要由多个产品系统中的一个来配置时 3、当要强调一系列相关的产品对象的设…

【Linux系统编程】第十九弹---进程状态(下)

​​​​​​​ ✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、僵尸进程 2、孤儿进程 3、运行状态 4、阻塞状态 5、挂起状态 6、进程切换 总结 1、僵尸进程 上一弹…

普通人也能创业!轻资产短视频带货项目,引领普通人实现创业梦想

在这个信息爆炸的时代&#xff0c;创业似乎成为了越来越多人的梦想。然而&#xff0c;传统的创业模式 keJ0277 往往伴随着高昂的资金投入和复杂的管理流程&#xff0c;让许多普通人望而却步。然而&#xff0c;现在有一种轻资产短视频带货项目正在悄然兴起&#xff0c;它以其低…

apifox接口调试工具的使用,代替postman

官网链接&#xff1a;Apifox &#xff08;代替postman工具&#xff09; 下载apifox工具 使用步骤 安装本地下载的apifox.exx 登录apifox 接口调用

从“制造”到“智造”:“灯塔”经验助力中国制造业转型升级-转载

作者&#xff1a;Karel Eloot&#xff0c;侯文皓&#xff0c;Francisco Betti&#xff0c;Enno de Boer和Yves Giraud 作为中国实体经济的主体&#xff0c;制造业是推动中国经济发展乃至全球制造业持续增长的重要引擎。站在历史与未来交汇的新起点上&#xff0c;中国制造业将背…

2024.05.14 Diffusion 代码学习笔记

配环境 我个人用的是Geowizard的环境&#xff1a;https://github.com/fuxiao0719/GeoWizard。 出于方便考虑&#xff0c;用的pytorch官方的docker容器&#xff0c;因此python版本&#xff08;3.10&#xff09;和原作者&#xff08;3.9&#xff09;不同&#xff0c;其余都是一…

【极简】docker常用操作

镜像images是静态的 容器container是动态的&#xff0c;是基于镜像的&#xff0c;类似于一个进程。 查看docker images&#xff1a; docker images 或者docker image ls 查看docker container情况&#xff1a;docker ps -a&#xff0c;-a意思是--all 运行一个container: doc…

DCMM(数据管理能力成熟度模型)对企业的价值

随着大数据时代的来临&#xff0c;数据已成为企业发展的重要驱动力。为了有效地管理和利用数据&#xff0c;企业需要建立一套完善的数据管理体系&#xff0c;而DCMM&#xff08;数据管理能力成熟度模型&#xff09;正是这样一个帮助企业构建和优化数据管理能力的框架。 DCMM结构…

LeetCode 235. 二叉搜索树的最近公共祖先

LeetCode 235. 二叉搜索树的最近公共祖先 1、题目 题目链接&#xff1a;235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表…