没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:莫成敏|2020-04-07 11:25:15.870|阅读 572 次
概述:本文将分享如何从项目中删除扫描仪模块以及如何使用DirectShow进行网络摄像头控制。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
Dynamsoft Barcode Reader SDK一款多功能的条码读取控件,只需要几行代码就可以将条码读取功能嵌入到Web或桌面应用程序。这可以节省数月的开发时间和成本。能支持多种图像文件格式以及从摄像机或扫描仪获取的DIB格式。使用Dynamsoft Barcode Reader SDK,你可以创建强大且实用的条形码扫描仪软件,以满足你的业务需求。
在Dynamsoft Barcode Reader SDK中,有一个名为BarcodeReaderDemo的精美网络摄像头条形码示例,它支持从磁盘文件、TWAIN兼容的硬件扫描仪和USB网络摄像头读取条形码。但是,您必须了解的一件事是,从外围设备获取图像的功能依赖于Dynamic .NET TWAIN,该功能也需要收费。幸运的是,图像查看器库和图像编解码器库是免费使用的。在本文中,我将分享如何从项目中删除扫描仪模块以及如何使用DirectShow进行网络摄像头控制。
关于Dynamsoft Barcode Reader演示的知识
下载并安装Dynamsoft Barcode Reader v7.3。
BarcodeReaderDemo项目位于<Dynamsoft Barcode Reader> \ Samples \ Desktop \ C#\ BarcodeReaderDemo中。它功能强大,可以执行各种条形码扫描测试。

与项目相关的库包括Dynamsoft.BarcodeReader.dll,Dynamsoft.ImageCore.dll,Dynamsoft.Forms.Viewer.dll,Dynamsoft.Camera.dll,Dynamsoft.PDF.dll和Dynamsoft.Twain.dll。
Windows安装程序将为Dynamsoft Barcode Reader和Dynamic .NET TWAIN生成试用许可证,以应用程序配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key ="DBRLicense" value ="LICENSE-KEY"/>
<add key ="DNTLicense" value ="LICENSE-KEY"/>
</appSettings>
</configuration>
注意:Dynamsoft条形码阅读器许可证用于Dynamsoft.BarcodeReader.dll,而Dynamic .NET TWAIN许可证则用于Dynamsoft.Camera.dll,Dynamsoft.PDF.dll和Dynamsoft.Twain.dll。
用于网络摄像头控制的DirectShowNet
在寻找用于网络摄像头编程的C#代码时,您可能会注意到许多开发人员经常推荐使用OpenCV。OpenCV提供的相机API非常容易使用。但是,OpenCV不适合获取和设置复杂的摄像机参数,例如枚举多个摄像机和相关分辨率。要完全使用C#控制网络摄像头,我们可以在Windows 10上使用DirectShowNet。
带有DirectShowNet的网络摄像头条形码扫描仪
在以下各段中,我将修改BarcodeReaderDemo项目,以用DirectShow替换Dynamic .NET TWAIN进行网络摄像头编程。
代码更改
删除BarcodeReaderDemo.cs中的扫描仪选项卡:
// remove mRoundedRectanglePanelAcquireLoad.Controls.Add(mThAcquireImage);
通过调整标签大小来美化其余标签:
// before mThLoadImage.Size = new Size(103, 40); mThWebCamImage.Location = new Point(207, 1); mThWebCamImage.Size = new Size(103, 40); // after mThLoadImage.Size = new Size(156, 40); mThWebCamImage.Location = new Point(157, 1); mThWebCamImage.Size = new Size(156, 40);

删除动态.NET TWAIN相关代码:
// remove mTwainManager = new TwainManager(dntLicenseKeys); mCameraManager = new CameraManager(dntLicenseKeys); mPDFRasterizer = new PDFRasterizer(dntLicenseKeys); …
创建一个DSManager.cs文件以实现DirectShow逻辑。
定义两个结构来存储摄像机信息:
public struct Resolution
{
public Resolution(int width, int height)
{
Width = width;
Height = height;
}
public int Width { get; }
public int Height { get; }
public override string ToString() => $"({Width} x {Height})";
}
public struct CameraInfo
{
public CameraInfo(DsDevice device, List<Resolution> resolutions)
{
Device = device;
Resolutions = resolutions;
}
public DsDevice Device { get; }
public List<Resolution> Resolutions { get; }
}
枚举相机设备:
DsDevice[] devices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
if (devices != null)
{
cameras = new List<CameraInfo>();
foreach (DsDevice device in devices)
{
List<Resolution> resolutions = GetAllAvailableResolution(device);
cameras.Add(new CameraInfo(device, resolutions));
}
}
以下获取相机分辨率的代码段来自StackOverflow:
private List<Resolution> GetAllAvailableResolution(DsDevice vidDev)
{
try
{
int hr, bitCount = 0;
IBaseFilter sourceFilter = null;
var m_FilterGraph2 = new FilterGraph() as IFilterGraph2;
hr = m_FilterGraph2.AddSourceFilterForMoniker(vidDev.Mon, null, vidDev.Name, out sourceFilter);
var pRaw2 = DsFindPin.ByCategory(sourceFilter, PinCategory.Capture, 0);
var AvailableResolutions = new List<Resolution>();
VideoInfoHeader v = new VideoInfoHeader();
IEnumMediaTypes mediaTypeEnum;
hr = pRaw2.EnumMediaTypes(out mediaTypeEnum);
AMMediaType[] mediaTypes = new AMMediaType[1];
IntPtr fetched = IntPtr.Zero;
hr = mediaTypeEnum.Next(1, mediaTypes, fetched);
while (fetched != null && mediaTypes[0] != null)
{
Marshal.PtrToStructure(mediaTypes[0].formatPtr, v);
if (v.BmiHeader.Size != 0 && v.BmiHeader.BitCount != 0)
{
if (v.BmiHeader.BitCount > bitCount)
{
AvailableResolutions.Clear();
bitCount = v.BmiHeader.BitCount;
}
AvailableResolutions.Add(new Resolution(v.BmiHeader.Width, v.BmiHeader.Height));
}
hr = mediaTypeEnum.Next(1, mediaTypes, fetched);
}
return AvailableResolutions;
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
Console.WriteLine(ex.ToString());
return new List<Resolution>();
}
}
将相机名称和分辨率绑定到下拉列表。如果您更改下拉列表的索引,则会触发选择更改事件:
private void InitCameraSource()
{
cbxWebCamSrc.Items.Clear();
foreach (CameraInfo camera in mDSManager.GetCameras())
{
cbxWebCamSrc.Items.Add(camera.Device.Name);
}
cbxWebCamSrc.SelectedIndex = 0;
}
private void cbxWebCamSrc_SelectedIndexChanged(object sender, EventArgs e)
{
picBoxWebCam.Visible = true;
picBoxWebCam.BringToFront();
EnableControls(picboxReadBarcode);
EnableControls(pictureBoxCustomize);
InitCameraResolution();
}
private void InitCameraResolution()
{
cbxWebCamRes.Items.Clear();
foreach (Resolution resolution in mDSManager.GetCameras()[cbxWebCamSrc.SelectedIndex].Resolutions)
{
cbxWebCamRes.Items.Add(resolution.ToString());
}
cbxWebCamRes.SelectedIndex = 0;
}
设置用于接收摄像机帧的委托功能:
TaskCompletedCallBack callback = FrameCallback;
private volatile bool isFinished = true;
public void FrameCallback(Bitmap bitmap)
{
if (isFinished)
{
this.BeginInvoke((MethodInvoker)delegate
{
isFinished = false;
ReadFromFrame(bitmap);
isFinished = true;
});
}
private void ReadFromFrame(Bitmap bitmap)
{
UpdateRuntimeSettingsWithUISetting();
TextResult[] textResults = null;
int timeElapsed = 0;
try
{
DateTime beforeRead = DateTime.Now;
textResults = mBarcodeReader.DecodeBitmap(bitmap, "");
DateTime afterRead = DateTime.Now;
timeElapsed = (int)(afterRead - beforeRead).TotalMilliseconds;
if (textResults == null || textResults.Length <= 0)
{
return;
}
if (textResults != null)
{
mDSManager.StopCamera();
Bitmap tempBitmap = ((Bitmap)(bitmap)).Clone(new Rectangle(0, 0, bitmap.Width, bitmap.Height), bitmap.PixelFormat);
this.BeginInvoke(mPostShowFrameResults, tempBitmap, textResults, timeElapsed, null);
}
}
catch (Exception ex)
{
this.Invoke(mPostShowFrameResults, new object[] { bitmap, textResults, timeElapsed, ex });
}
}
.NET网络摄像头条形码扫描仪的屏幕截图


本教程内容就是这样了,希望对您有所帮助~感兴趣的朋友可以下载Dynamsoft Barcode Reader和Dynamic .NET TWAIN试用版免费使用~
相关内容推荐:
Dynamsoft Barcode Reader:解读条形码阅读器技术与开发的基础知识!
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@ke049m.cn
文章转载自:



在使用Parasoft C/C++test执行BugDetective数据流分析时,可能会遇到用户自定义的资源API,那在这种情况下,若要判断是否存在资源问题,如资源泄露等,则需要手动配置测试配置。
大型SaaS系统的自动化测试常常受制于界面变化快、结构复杂、加载机制多变等因素。从元素识别到脚本管理,SmartBear TestComplete帮助Salesforce建了可靠的自动化测试体系。
BarTender 标签管理系统,正是帮助企业轻松实现 GS1 标准化标签设计、编码生成与信息联动的强大工具。
Parasoft C/C++test 是一款功能强大的 C/C++ 软件测试工具,集成了静态代码分析、单元测试、集成测试和覆盖率分析等功能,单元测试作为其关键功能之一,为了适配多样化的目标部署环境,C/C++test 设计了灵活的测试结果收集机制。通过Socket通讯方式来收集单元测试结果,从而扩展其测试覆盖范围与应用场景。
相关产品
Dynamsoft Barcode Reader SDK是一款多功能的条码读取控件。
Dynamic .NET TWAINDynamic .NET TWAIN是为桌面应用程序设计的.NET控件,适用于C#和VB.NET,能让你从任何TWAIN设备中获取图像的托管代码SDK。
最新文章 MORE
半岛外围网上直营相关的文章 MORE
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@ke049m.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
半岛外围网上直营 