C#_摄像头图像转换为Bitmap格式及绘制十字线

 之前MFC的是用的OpenCV画线然后显示到控件的方式,C#下使用OpenCV还没研究过,不过参考把图像转换成Bitmap格式然后画线的方式也可以实现

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Diagnostics;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

using DVPCameraType;//相机SDK命名空间

namespace DrawCross
{
    public partial class Form1 : Form
    {
        public static IntPtr m_ptr_wnd = new IntPtr();
        public static IntPtr m_ptr = new IntPtr();
        private DVPCamera.dvpStreamCallback _proc;
        uint m_handle = 0;//相机句柄

        public static bool m_draw=false;
        public static Form1 lpsf;//Bitmap贴图句柄

        public Form1()
        {
            InitializeComponent();
            m_ptr_wnd = pictureBox1.Handle;//贴图控件句柄

            lpsf = this;

            Select.Items.Clear();//每次点击枚举按钮后先清空列表
            int item;//下拉列表项目索引
            uint count = 0;//设备数量
            dvpCameraInfo dev_info = new dvpCameraInfo();//相机信息结构体
            DVPCamera.dvpRefresh(ref count);//刷新相机数量
            for (uint i = 0; i < count; i++)
            {
                DVPCamera.dvpEnum(i, ref dev_info);//枚举
                item = Select.Items.Add(dev_info.FriendlyName);//添加到下拉列表,会返回0
                Select.SelectedIndex = item;//设置下拉列表项目为第一个索引
            }
        }

        //private ColorPalette tempPalette;

        /*视频流回调函数*/
        public static int _dvpStreamCallback(uint handle, dvpStreamEvent _event, IntPtr pContext, ref dvpFrame refFrame, IntPtr pBuffer)
        {
            if(m_draw)
            {
                /*绘制十字线*/

                //转换BMP位图
                Bitmap bmp = null;
                if (refFrame.format == dvpImageFormat.FORMAT_BGR24)
                {
                    bmp = new Bitmap(refFrame.iWidth, refFrame.iHeight, refFrame.iWidth * 3, PixelFormat.Format24bppRgb, pBuffer);
                }
                else if (refFrame.format == dvpImageFormat.FORMAT_MONO)
                {
                    ColorPalette tempPalette;
                    bmp = new Bitmap(refFrame.iWidth, refFrame.iHeight, refFrame.iWidth, PixelFormat.Format8bppIndexed, pBuffer);

                    tempPalette = bmp.Palette;
                    for (int i = 0; i < 255; i++)
                    {
                        tempPalette.Entries[i] = System.Drawing.Color.FromArgb(0, i, i, i);
                    }
                    bmp.Palette = tempPalette;
                }

                //bmp.Save("D:\\" + count++ + ".jpeg", ImageFormat.Jpeg);

                //return 0;
                #region
                Bitmap rgb = new Bitmap(refFrame.iWidth, refFrame.iHeight);
                Graphics g = Graphics.FromImage(bmp);

                Pen mypen = new Pen(Color.Red, 4);
                Brush nBrush = new SolidBrush(Color.Blue);
                int a;
                Font font = new Font("微软雅黑", 56);

                g.DrawImage(bmp, 0, 0, refFrame.iWidth, refFrame.iHeight);

                a = refFrame.iHeight / 2;
                g.DrawLine(mypen, 0, a, refFrame.iWidth, a);

                a = refFrame.iWidth / 2;
                g.DrawLine(mypen, a, 0, a, refFrame.iHeight);

                //g.DrawString("DuShen", font, nBrush, refFrame.iWidth / 2, refFrame.iHeight / 2);

                lpsf.pictureBox1.Image = bmp;
                #endregion
            }
            else
            {
                //将图像数据绘制到贴图控件
                dvpStatus status = DVPCamera.dvpDrawPicture(ref refFrame, pBuffer, m_ptr_wnd, (IntPtr)0, (IntPtr)0);
            }
            
            return 0;
        }

        private void Refresh_Click(object sender, EventArgs e)
        {
            Select.Items.Clear();//每次点击枚举按钮后先清空列表
            int item;//下拉列表项目索引
            uint count = 0;//设备数量
            dvpCameraInfo dev_info = new dvpCameraInfo();//相机信息结构体
            DVPCamera.dvpRefresh(ref count);//刷新相机数量
            for (uint i = 0; i < count; i++)
            {
                DVPCamera.dvpEnum(i, ref dev_info);//枚举
                item = Select.Items.Add(dev_info.FriendlyName);//添加到下拉列表,会返回0
                Select.SelectedIndex = item;//设置下拉列表项目为第一个索引
            }
        }

        private void Open_Click(object sender, EventArgs e)
        {
            DVPCamera.dvpOpenByName(Select.Text, dvpOpenMode.OPEN_NORMAL, ref m_handle);//打开

            //注册视频流回调函数
            _proc = _dvpStreamCallback;
            DVPCamera.dvpRegisterStreamCallback(m_handle, _proc, dvpStreamEvent.STREAM_EVENT_PROCESSED, m_ptr);
            DVPCamera.dvpSetTargetFormat(m_handle, dvpStreamFormat.S_BGR24);
            dvpStatus status = DVPCamera.dvpStart(m_handle);//启动视频流
        }

        private void Set_Click(object sender, EventArgs e)
        {
            DVPCamera.dvpShowPropertyModalDialog(m_handle, this.Handle);//参数设置窗口
        }

        private void DrawCross_CheckedChanged(object sender, EventArgs e)
        {
            if(DrawCross.Checked)
            {
                m_draw = true;
            }
            else
            {
                m_draw = false;
            }
        }
    }
}

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值