之前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;
}
}
}
}