首页 > 其他分享 >利用OpenCvSharp进行图像相关操作

利用OpenCvSharp进行图像相关操作

时间:2024-08-11 10:24:57浏览次数:6  
标签:Mat img int 图像 VideoCapture OpenCvSharp new 操作 panda

前言

程序设计过程,有时也需要对图像进行一些简单操作,C#没有现成的图像处理库,但有人对OpenCV进行了包装,我们可以很方便的使用OpenCvSharp对图像进行操作。当然了,这也需要使用的人员进行一些研究,但相对于C++版本,它已经非常友好了。

1、显示图像

代码:

private void button1_Click(object sender, EventArgs e)
        {
            //读取图像为灰度图
            panda = new Mat("1.jpg", ImreadModes.Color);

            //把Mat格式的图片转换成Bitmap
            Bitmap bitmap = BitmapConverter.ToBitmap(panda);

            //显示图片
            pictureBox2.Image = bitmap;
        }

效果:

2、绘制元素

代码:

 private void DrawObject()
        {
            //画圆方法
            Cv2.Circle(panda, new OpenCvSharp.Point(100, 100), 100, new Scalar(0, 69, 255), 5);  //以宽度画圆 不填充
            Cv2.Circle(panda, new OpenCvSharp.Point(300, 100), 100, new Scalar(0, 69, 255), -1); //当为负数的时候,进行画整圆 填充,C++用FILLED进行代替

            //画矩形
            Cv2.Rectangle(panda, new OpenCvSharp.Point(100, 260), new OpenCvSharp.Point(400, 400), new Scalar(141, 218, 86), 3);

            //画线
            Cv2.Line(panda, new OpenCvSharp.Point(200, 300), new OpenCvSharp.Point(350, 400), new Scalar(87, 176, 174), 3);

            //绘制文字
            Cv2.PutText(panda, "Please advise!", new OpenCvSharp.Point(200, 500), HersheyFonts.HersheyDuplex, 0.75, new Scalar(193, 242, 75));

            Random random = new Random();
            Vec3b vec = new Vec3b(255, 255, 255);
            for (int i = 0; i < 3000; i++)//30000个点
            {
                int row = random.Next(panda.Rows);
                int col = random.Next(panda.Cols);
                //char white = (char)255;
                panda.Set(row, col, vec);
            }
            //把Mat格式的图片转换成Bitmap
            Bitmap bitmap = BitmapConverter.ToBitmap(panda);

            //显示图片
            pictureBox2.Image = bitmap;
        }

效果:

3、图像数据操作

代码:

private void Test()
        {
            Console.WriteLine("开始生成图片:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"));
            int imageWidth = 1024;
            int imageHeight = 128;
            ushort[] orginImgData = new ushort[imageHeight * imageWidth];
            string filename = "123.bmp";
            Random random = new Random();
            for (int i = 0; i < imageWidth; i++)
            {
                for (int j = 0; j < imageHeight; j++)
                {
                    orginImgData[i * imageHeight + j] = (ushort)random.Next(0, 65535);
                }
            }
            GenImage(imageWidth, imageHeight, orginImgData, filename);
        }

        private void GenImage(int imageWidth, int imageHeight, ushort[] orginImgData, string filename)
        {
            int row = (int)imageWidth;
            int col = (int)imageHeight;
            Mat picMat = new Mat(row, col, MatType.CV_16UC1);
            int r = 0;
            int c = 0;

            unsafe
            {
                for (r = 0; r < row; r++)
                {
                    IntPtr p = picMat.Ptr(r);
                    ushort* pp = (ushort*)p.ToPointer();
                    for (c = 0; c < col; c++)
                    {
                        // picMat.Set<ushort>(r,c, orginImgData[r * col + c]);
                        pp[c] = orginImgData[r * col + c];
                    }
                }

                Cv2.ImWrite(filename, picMat);
            }
            picMat.Dispose();
            Console.WriteLine("结束生成图片:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"));
        }

效果:

4、操作摄像头

代码:

 Task.Run(() =>
            {
                //VideoCapture cap = new VideoCapture(1, VideoCaptureAPIs.DSHOW);
                VideoCapture cap = new VideoCapture(0, VideoCaptureAPIs.ANY);
              //  VideoCapture cap = new VideoCapture(path, VideoCaptureAPIs.ANY);
                Mat img = new Mat();

                while (true)
                {
                    cap.Read(img);
                    if (!img.Empty())
                    {
                        //把Mat格式的图片转换成Bitmap
                        Bitmap bitmap = BitmapConverter.ToBitmap(img);

                        //显示图片
                        pictureBox1.Image = bitmap;
                    }
                    else
                    {
                        Console.WriteLine("ERROR|NO IMG");
                        break;
                    }

                    Thread.Sleep(1);
                }
            });

效果:

5、播放电影

代码:

 Task.Run(() =>
            {
                string path = @"D:\狄仁杰之亢龙有悔.mkv";
                //VideoCapture cap = new VideoCapture(1, VideoCaptureAPIs.DSHOW);
                // VideoCapture cap = new VideoCapture(0, VideoCaptureAPIs.ANY);
                VideoCapture cap = new VideoCapture(path, VideoCaptureAPIs.ANY);
                Mat img = new Mat();

                while (true)
                {
                    cap.Read(img);
                    if (!img.Empty())
                    {
                        //Cv2.ImShow("Video", img);

                        //把Mat格式的图片转换成Bitmap
                        Bitmap bitmap = BitmapConverter.ToBitmap(img);

                        //显示图片
                        pictureBox1.Image = bitmap;
                    }
                    else
                    {
                        Console.WriteLine("ERROR|NO IMG");
                        break;
                    }

                    Thread.Sleep(1);
                }
            });

效果:

标签:Mat,img,int,图像,VideoCapture,OpenCvSharp,new,操作,panda
From: https://blog.csdn.net/weixin_45114627/article/details/140931154

相关文章

  • [图文直播]Windows操作系统部署Jenkins
    前言首先说明一下我为什么选择在Windows操作系统上部署Jenkins是吧,主要基于虽然从长远上看,我是有进行跨平台开发的需求,但至少在可预见的三到五年时间内,我的潜在客户也都是在windows操作系统上。至于跨平台,规划上要有,但正如天龙八部里天龙寺内面对鸠摩智打算拿拈花指、无相劫指......
  • CUDA--内存访问越界或无效的索引操作解决办法
    报错信息File"D:\anaconda3\envs\HCAVE2\lib\site-packages\torch\nn\utils\rnn.py",line258,inpack_padded_sequencesorted_indices=sorted_indices.to(input.device)RuntimeError:CUDAerror:device-sideasserttriggeredCUDAkernelerrorsm......
  • CUDA--内存访问越界或无效的索引操作解决办法--总结
    设备端的断言错误(device-sideasserttriggered)通常发生在CUDA代码中访问无效的内存地址或执行了无效的操作。解决这种错误需要系统地排查代码中的潜在问题。以下是详细的解决方案:1.检查数组边界确保所有访问数组或指针的操作都在有效范围内。检查线程索引和块索引的计算,确......
  • 【时时三省】(C语言基础)操作符3
    山不在高,有仙则名。水不在深,有龙则灵。             ----CSDN时时三省&取地址操作符示例: 每个内存单元都有自己的编号编号就成为内存单元的地址&a就是找出a的地址后面可以加一个int*pa=&a是可以用来存放地址pa是用来存放地址的-pa就是一......
  • 【大作业-17】使用TensorFlow快速实现图像风格迁移系统
    使用TensorFlow快速实现图像风格迁移系统资源地址:28-基于Tensorflow的风格迁移+代码+模型+系统界面+教学视频.zip资源-CSDN文库视频地址:[使用Tensorflow实现图像风格迁移系统_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1VE421w7RY/)随着GPT的横空出世,生成......
  • 嵌入式硬件操作接口实现分享
    一、前言以STM32为例,打开网络上下载的例程或者是购买开发板自带的例程,都会发现应用层中会有stm32f10x.h或者stm32f10x_gpio.h,这些文件严格来时属于硬件层的,如果软件层出现这些文件会显得很乱。使用过Linux的童鞋们肯定知道linux系统无法直接操作硬件层,打开linux或者rt_threa......
  • Ai绘画|如何安装使用最简单的秋叶版ComfyUI 整合包,万字长文手把手详细教你安装部署,快速
    大家好,我是灵魂画师向阳AI绘画界的国内开源大神——B站的秋叶大佬在1月份就已经发布了AI绘画工具ComfyUI的整合包。用户将压缩包下载后,能够一键启动comfyui。其便利性与之前的webui整合包如出一辙。然而在整合包下载完成后,新手或许会遭遇插件以及模型缺失的情况,同......
  • go项目实战之word、pdf、txt操作
    最近在项目开发中,频繁的遇到需要对Docx、PDF、TXT等类型的文本进行操作,而目前这方面有unidoc/unioffice,但这个是非开源的,所以使用起来有诸多不方便。而且也搜了很多资料,但是都太笼统了,不方便使用,所以特写此文章希望能帮助大家解决问题!以下代码都可直接复制粘贴使用DO......
  • 图像滤波算法
    3.1平滑滤波器(SmoothingFilters)介绍平滑滤波器用于去除图像中的噪声,使图像更加平滑和柔和。常见的平滑滤波器包括均值滤波和高斯滤波。原理平滑滤波器通过对像素及其邻域像素的值进行平均或加权平均,来减少图像中的噪声。均值滤波采用简单的均值计算,而高斯滤波则使用加......
  • opencv图像增强一:传统图像去噪方法整理
    一、简介:在数字图像处理领域,噪声一直是影响图像质量的重要因素。无论是拍摄过程中的环境干扰,还是传输过程中的信号失真,噪声都可能导致图像模糊、细节丢失,甚至影响后续的图像分析和应用。为了提高图像的视觉效果和使用价值,图像去噪技术应运而生,成为图像预处理环节中不可或缺......