有没有用 C# 编写 嵌入摄像头画面的朋友,这个怎么弄的

lich2005 2019-06-04 03:36:59
以前从未弄过这方面的东西,实在不懂。
目前打算弄一个程序,应该类似停车场或者小区监控那种程序,画面内嵌到程序里面,比如可以点一下放大或者缩小画面之类的操作。
摄像头好像是海康的,用的达芬奇的商务展板,想到时用作展示方面的用途,是不是把程序放在普通PC上再连接达芬奇平板?
只是怎么把摄像画面接到程序里面来,这方面实在没思路,也从来没弄过。
有这方面的朋友知道怎么来做吗,谢谢。
...全文
220 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
6lilu9 2019-06-05
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380 的回复:
海康本来就有sdk,赶紧去海康官网下sdk把
lich2005 2019-06-05
  • 打赏
  • 举报
回复
谢谢楼上的各位朋友。
另外,再问问,要是用的一般的那种家用摄像头,找不到SDK的,是不是就没办法内嵌到程序里面显示了?
lich2005 2019-06-05
  • 打赏
  • 举报
回复
谢谢各位。目前打算用嵌入网页来播放解决这个问题。
这文章很有参考价值,希望能帮助碰到类似问题的朋友。
https://blog.csdn.net/qi923701/article/details/79882706
鱼dotNet 2019-06-05
  • 打赏
  • 举报
回复
可以获取摄像头的视频每一帧的数据解压缩成图片在控件上显示,或者用vlc的插件可以直接播放rtsp、rtmp流格式视频。
jx315425246 2019-06-05
  • 打赏
  • 举报
回复
实际上是要从海康的NVR(网络硬盘录像机)中转一下的

引用海康API,以下是代码


class nvr_info
{
private string _nvr_name;
private string _nvr_ip;
private int _nvr_port;
private string _nvr_user;
private string _nvr_pass;

public string nvr_name
{
get { return _nvr_name; }
set { _nvr_name = value; }
}

public string nvr_ip
{
get { return _nvr_ip; }
set { _nvr_ip = value; }
}

public int nvr_port
{
get { return _nvr_port; }
set { _nvr_port = value; }
}

public string nvr_user
{
get { return _nvr_user; }
set { _nvr_user = value; }
}

public string nvr_pass
{
get { return _nvr_pass; }
set { _nvr_pass = value; }
}

public NET_DVR_DEVICEINFO_V30 nvr_device;
}

NET_DVR_IPPARACFG_V40 m_struIpParaCfgV40;
NET_DVR_PICCFG_V40 m_struPicCfgV40;

int pre_ch = 0;


//读取硬盘录像机及摄像头信息
private void show_nvr_tree()
{
//bool flag;
long i;
int j, k, m, n, p, ch, numb, nvr_numb, vh;
string rs;

char[] sp = { '\r', '\n' };
string[] rss = rs.Split(sp, StringSplitOptions.RemoveEmptyEntries);
//flag = NET_DVR_Init();
nvr_info nvrinfo = new nvr_info();
treeView1.Nodes.Clear();

//硬盘录像机名称(可以随便起名)
nvrinfo.nvr_name = "东部区硬盘录像机1";
//硬盘录像机IP
nvrinfo.nvr_ip = "";
//硬盘录像机端口
nvrinfo.nvr_port = 8000;
//硬盘录像机登录名
nvrinfo.nvr_user = "admin";
//硬盘录像机登密码
nvrinfo.nvr_pass = "123456";

p = NET_DVR_Login_V30(nvrinfo.nvr_ip, nvrinfo.nvr_port, nvrinfo.nvr_user, nvrinfo.nvr_pass, ref nvrinfo.nvr_device);

if (p != -1)
{
TreeNode tn = new TreeNode();
tn.Text = nvrinfo.nvr_name + "-" + nvrinfo.nvr_ip;
tn.Name = nvrinfo.nvr_name + "," + nvrinfo.nvr_ip + "," + nvrinfo.nvr_port + "," + nvrinfo.nvr_user + "," + nvrinfo.nvr_pass;
tn.ToolTipText = nvrinfo.nvr_ip;

treeView1.Nodes.Add(tn);

n = nvrinfo.nvr_device.byHighDChanNum * 256 + nvrinfo.nvr_device.byIPChanNum;
ch = nvrinfo.nvr_device.byStartDChan;
vh = nvrinfo.nvr_device.byStartDTalkChan;
uint dwSize = (uint)Marshal.SizeOf(m_struIpParaCfgV40);

IntPtr ptrIpParaCfgV40 = Marshal.AllocHGlobal((Int32)dwSize);
Marshal.StructureToPtr(m_struIpParaCfgV40, ptrIpParaCfgV40, false);

uint dwReturn = 0;
if (NET_DVR_GetDVRConfig(p, NET_DVR_GET_IPPARACFG_V40, -1, ptrIpParaCfgV40, dwSize, ref dwReturn))
{
m_struIpParaCfgV40 = (NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(NET_DVR_IPPARACFG_V40));
for (numb = 0; numb < m_struIpParaCfgV40.dwDChanNum; numb++)
{
byte byStreamType;
NET_DVR_STREAM_MODE m_struStreamMode = new NET_DVR_STREAM_MODE();
byStreamType = m_struIpParaCfgV40.struStreamMode[numb].byGetStreamType;
dwSize = (uint)Marshal.SizeOf(m_struStreamMode);
if (byStreamType == 0)
{
IntPtr ptrChanInfo = Marshal.AllocHGlobal((Int32)dwSize);
Marshal.StructureToPtr(m_struIpParaCfgV40.struStreamMode[numb].uGetStream, ptrChanInfo, false);
NET_DVR_IPCHANINFO m_struChanInfo = new NET_DVR_IPCHANINFO();
m_struChanInfo = (NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(NET_DVR_IPCHANINFO));


//列出IP通道 List the IP channel
if (m_struChanInfo.byEnable == 1)
{
TreeNode tns = new TreeNode();
tns.Name = (numb + 1).ToString();
tns.Text = (numb + 1).ToString() + " 通道:";

dwReturn = 0;
Int32 nSize = Marshal.SizeOf(m_struPicCfgV40);
IntPtr ptrPicCfg = Marshal.AllocHGlobal(nSize);
Marshal.StructureToPtr(m_struPicCfgV40, ptrPicCfg, false);
if (NET_DVR_GetDVRConfig(p, NET_DVR_GET_PICCFG_V40, numb + ch, ptrPicCfg, (UInt32)nSize, ref dwReturn))
{
m_struPicCfgV40 = (NET_DVR_PICCFG_V40)Marshal.PtrToStructure(ptrPicCfg, typeof(NET_DVR_PICCFG_V40));
tns.Text = tns.Text + Encoding.GetEncoding("GBK").GetString(m_struPicCfgV40.sChanName);
tns.Name = (numb + ch).ToString() + "," + (vh + numb).ToString();
//tns.Text=tns.Text+m_struPicCfgV40.
}
treeView1.Nodes[0].Nodes.Add(tns);
}
}
}


}
//m=nvrinfo.nvr_device.

}

//}
treeView1.ExpandAll();
//NET_DVR_Cleanup();
}

//播放画面
private void button5_Click(object sender, EventArgs e)
{
int k;
NET_DVR_DEVICEINFO_V30 nvrinf = new NET_DVR_DEVICEINFO_V30();
if (treeView1.SelectedNode != null)
{
if (treeView1.SelectedNode.Parent != null)
{
string[] nvr_str = treeView1.SelectedNode.Parent.Name.Split(',');
k = NET_DVR_Login_V30(nvr_str[1], int.Parse(nvr_str[2]), nvr_str[3], nvr_str[4], ref nvrinf);
if (k != -1)
{

NET_DVR_PREVIEWINFO nvr_pre = new NET_DVR_PREVIEWINFO();
nvr_pre.hPlayWnd = pictureBox1.Handle;
string[] nvr_ch = treeView1.SelectedNode.Name.Split(',');
nvr_pre.lChannel = int.Parse(nvr_ch[0]);
nvr_pre.dwStreamType = 0;
nvr_pre.dwLinkMode = 0;
nvr_pre.bBlocked = true;
nvr_pre.dwDisplayBufNum = 15;
//pre_ch = nvr_pre.lChannel;
pre_ch = NET_DVR_RealPlay_V40(k, ref nvr_pre, null, IntPtr.Zero);

}
//button5.Enabled = false;
}
}
}
//停止播放
private void button6_Click(object sender, EventArgs e)
{
NET_DVR_StopRealPlay(pre_ch);
}
wanghui0380 2019-06-05
  • 打赏
  • 举报
回复
海康的sdk是通用的,海康所有产品都支持 如果你是其他牌子的其实也没问题,现在摄像头都支持ONVIF/RTSP协议 如果你碰到古老的没有ONVIF/RTSP,也没关系。至少他是一个视频输出设备,所以可以使用默认视频输出采集。
OrdinaryCoder 2019-06-05
  • 打赏
  • 举报
回复
引用 4 楼 lich2005 的回复:
谢谢楼上的各位朋友。
另外,再问问,要是用的一般的那种家用摄像头,找不到SDK的,是不是就没办法内嵌到程序里面显示了?

就我知道的用opencv和halcon都可以连接到摄像头 只不过开销有点大而已 你也可以上网找找有没有其他的东西 因为摄像头这东西底层都是遵守一定协议的
wxmtgg 2019-06-04
  • 打赏
  • 举报
回复
海康sdk有C#的demo
OrdinaryCoder 2019-06-04
  • 打赏
  • 举报
回复
海康sdk有C#的demo
wanghui0380 2019-06-04
  • 打赏
  • 举报
回复
海康本来就有sdk,赶紧去海康官网下sdk把

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧