0
点赞
收藏
分享

微信扫一扫

3D视觉技术如何助力惯性环精准上料

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用CFMIME Encoder方法进行图像压缩保存(C++)

Baumer工业相机

Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。

Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。

Baumer工业相机由于其性能和质量的优越和稳定,常用于高速同步采集领域,通常使用各种图像算法来提高其捕获的图像的质量。

Baumer工业相机NEOAPI SDK是用于Baumer工业相机的一款最新的软件开发工具包(SDK)。它为开发人员提供了一系列API和工具,用于与Baumer工业相机进行通信和控制,控制方式极为便捷类似Halcon的相机助手类控制方式。​

Baumer工业相机堡盟相机在SDK中的原始图像使用CFMIME Encoder方法进行图像压缩保存进行联合,从而实现外部图像进行压缩的功能设置。

Baumer工业相机通过NEOSDK进行图像压缩的技术背景

Baumer工业相机的NEOAPI SDK是Baumer公司开发的针对其相机产品系列的一套软件开发工具包。该SDK提供了一组API,使开发人员可以编写专业应用程序,从而控制、捕获、处理和显示Baumer相机的图像和数据。BGAPI SDK支持多种编程语言,包括C++、C#、Visual Basic、LabVIEW、Matlab等,并提供了大量示例代码和文档,以帮助用户轻松上手,快速完成应用程序的开发。

NEOAPI SDK提供了丰富的功能,可以控制Baumer相机的所有参数,包括曝光时间、增益、白平衡、触发模式等,以及支持各种数据格式,例如Raw、BMP、JPG等,同时还提供了实时显示、数据采集、图像处理等功能,为开发人员提供了高度定制化的解决方案。此外,BGAPI SDK还支持多相机系统的开发,并可支持各种计算机操作系统,如Windows、Linux、Mac OS等。

CFMIME Encoder是一个高级的图像压缩和保存工具,可以处理多种图像格式,包括JPEG、PNG、GIF、BMP等。以下是一些常见的MFC例程,用于进行图像压缩和保存:

这里主要描述如何在C++的平台下实现通过NEOAPI SDK实现图像质量压缩的核心代码

代码分析

本文介绍使用NEOAPI SDK对Baumer的工业相机进行开发时,使用通过NEOAPI SDK和微软的图像压缩算法进行图像转换的功能,注意Image算法的使用需要将Buffer图像先转为Bitmap数据,再进行压缩算法的使用。

第一步:先引用对应的NET框架的DLL文件

C++环境下引用CFMIME Encoder作为图像处理库代码如下所示:

#include <afximg.h>
#include <stdio.h>
#include <iostream>
#include "bgapi2_genicam/bgapi2_genicam.hpp"
#include "neoapi.hpp"

第二步:在回调函数里进行Buffer图像转换为Image图像进行压缩

下面为图像转换为Image图像的核心代码,如下所示:

NeoAPI::Cam camera = NeoAPI::Cam();
camera.Connect();
camera.f().ExposureTime.Set(10000);

int width = static_cast<int>(camera.f().Width);
int height = static_cast<int>(camera.f().Height);

if (camera.IsConnected())
{		
	//	获取当前相机的图像的像素格式   
	NeoAPI::NeoString CurPixelFormat = camera.f().PixelFormat.GetString();
	CString CurPixelFormatstr = (CString)CurPixelFormat;		
			
	NeoAPI::FeatureList FeatureListS = camera.f().PixelFormat.GetEnumValueList();
	// 检查该相机是否存在短曝光模式
	if (camera.f().ShortExposureTimeEnable.IsAvailable())
	{
		// 开启短曝光功能
		camera.f().ShortExposureTimeEnable.Set(TRUE);
		// 设置曝光为1微秒
		camera.f().ExposureTime.Set(1.0);
		// 设置相机为自由采集模式
		camera.f().TriggerMode.Set(NeoAPI::TriggerMode::Off);
		// 启动相机开始采集  
		camera.f().AcquisitionStart.Execute();
		// 采集一张图像 
		NeoAPI::Image image = camera.GetImage();
    	//  保存采集图像
		unsigned char* imagebuffer = NULL;
		USES_CONVERSION;

		int width = 0, height = 0;
		width = (int)image.GetWidth();height = (int)image.GetHeight();	//获取当前图像像素长宽
		CString PixelFormat1 = (CString)image.GetPixelFormat();		    //获取当前图像像素格式
		imagebuffer = (BYTE*)(image.GetImageData());			        //获取当前图像数据
		
		CString ImageID1str;
		ImageID1str.Format(_T("%d"), (int)image.GetImageID());		    //获取当前图像FrameID

		Gdiplus::Rect rc = Gdiplus::Rect(0, 0, width, height);

		#pragma region 黑白相机代码:像素格式为mono时转Bitmap的代码,彩色相机此处代码不同
		if (m_pBitmap == NULL)
		{
			m_pBitmap = new Gdiplus::Bitmap(width, height, PixelFormat8bppIndexed);
		}
		Gdiplus::BitmapData lockedbits;
		Gdiplus::ColorPalette * pal = (Gdiplus::ColorPalette*)new 	BYTE[sizeof(Gdiplus::ColorPalette) + 255 * sizeof(Gdiplus::ARGB)];
		pal->Count = 256;
		for (UINT i = 0;i < 256;i++)
		{
			UINT color = i * 65536 + i * 256 + i;
			color = color | 0xFF000000;
			pal->Entries[i] = color;
		}
		m_pBitmap->SetPalette(pal);
		Gdiplus::Status ret = m_pBitmap->LockBits(&rc, Gdiplus::ImageLockModeWrite, PixelFormat8bppIndexed, &lockedbits);
		BYTE* pixels = (BYTE*)lockedbits.Scan0;
		BYTE* src = (BYTE*)imagebuffer;
		for (int row = 0; row < height; ++row)
		{
			CopyMemory(pixels, src, lockedbits.Stride);
			pixels += width;
			src += width;
		}
		m_pBitmap->UnlockBits(&lockedbits);
		
		#pragma endregion 
    	CString strtime;
		strtime.Format(_T("\\%4d%2d%2d%2d%2d%2d"), time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
		CString  strpath = m_strDirectory + strtime + "-";
		CString  strpath2;
		strpath2.Format(_T("%s%d"), strpath, image.GetImageID());
		// 转换图像名称为NeoAPI::NeoString格式,然后保存对应路径
		USES_CONVERSION;
		std::string strpath2str(W2A(strpath2));
		const char* strpath2str2 = strpath2str.c_str();
		NeoAPI::NeoString strpath3 = strpath2str2;
		image.Save(strpath3);
		image.Save("neoapi-sdk-shortexposuretime-image");   	
	}
	
}


第三步:CFMIME Encoder图像压缩算法

下面为使用CFMIME Encoder图像压缩算法的核心代码,如下所示:

#include <afximg.h>
CFMIMEEncode* pEncoder = new CFMIMEEncode();
pEncoder->SetDimension(JPEG_DIMENSION); // set the image dimension
pEncoder->SetQuality(JPEG_QUALITY); // set the compression quality

CImage image; // create an image object
image.Load("image.jpg"); // load the image to be encoded
pEncoder->Encode(image, "output.jpg"); // encode the image and save it to "output.jpg"

delete pEncoder;

AFX_INLINE void CMyApp::EncodeJPEG(const CImage& image, const char* filename)
{
	CFMIMEEncode(image, filename, JPEG_DIMENSION, JPEG_QUALITY, 0, NULL);
}

CFMIME Encoder提供了许多可用的选项,以便在压缩图像时非常灵活。以下是一些常见的选项:

CFMIME_ENCODER_MASK: 用于指定要压缩的图像类型。例如,可以将这个选项设置为JPEG,以仅压缩JPEG图像。

CFMIME_QUALITY: 用于指定压缩图像的质量。高 Ésateur 将压缩的质量更高,低шего русExamplequality 将压缩的质量更低。

CFMIME_COMPRESSION: 用于指定压缩 algorithm。例如,可以将这个选项设置为7,以使用FFMPEG进行压缩。

CFMIME_BUILD_INPUT_PARAM: 用于指定Input通过�own walking步骤进行压缩。例如,可以将这个选项设置

工业相机图像通过NEOAPI SDK使用CFMIME Encoder方法进行图像压缩的优点

  1. 高质量和可控的图像压缩
    通过使用 CFMIME Encoder,开发者可以详细指定压缩的质量。例如,对于JPEG格式的图像,可以通过调整质量参数来平衡图像质量与文件大小。这是通过设置 Encoder.Quality 参数来实现的,该参数允许指定从0到100的质量级别(100是最高质量但文件大小也最大)。

  2. 支持多种文件格式
    CFMIME Encoder 支持多种图像格式的编码和压缩,包括但不限于JPEG, GIF, TIFF, 和 PNG。这意味着开发者可以根据需要选择最合适的格式,以满足不同的图像质量要求和文件大小限制。

  3. 细粒度控制图像保存参数
    Encoder 类与 EncoderParameters 一起工作,后者提供了一种方式来传递多个编码参数。这包括但不限于压缩质量。例如,对于TIFF文件,可以控制图像是否以单页或多页格式保存,这在处理文档扫描时特别有用。

  4. 改善性能
    通过适当的压缩设置,可以显著减少图像文件的大小,这将节省存储空间并可能改善应用程序的性能,特别是在加载和传输大量图像时。

  5. 可透过元数据设置对图像的额外控制
    CFMIME Encoder 不仅能控制图像的压缩,还可以处理图像的元数据。例如,可添加或修改EXIF信息,这对于摄影和图像档案管理非常重要。

  6. 与.NET集成
    由于CFMIME Encoder 是c++框架的一部分,因此与C++或其他.NET语言紧密集成,无需额外学习或使用第三方库,简化了开发过程。

工业相机图像通过NEOAPI SDK使用使用CFMIME Encoder方法图像压缩的行业应用

在工业领域,工业相机广泛应用于自动化检测、质量控制、机器视觉等环节。工业相机捕获的图像常常需要进行高效的压缩与保存,以便于存储或进一步分析处理。使用CFMIME Encoder类可以在这些应用中发挥重要作用,具体包括以下几个方面的行业应用:

  1. 自动化质量控制

在制造业中,通过工业相机捕捉产品在生产线上的图像,用于检测和分析产品是否存在缺陷。图像数据量通常很大,使用CFMIME Encoder可以有效地压缩图像文件,降低存储空间需求,同时便于在网络中传输这些图像到质量检测系统进行进一步分析。

  1. 机器视觉系统

机器视觉系统广泛用于汽车组装、电子装配和包装等行业。这些系统依靠工业相机捕获的高分辨率图像来指导机器人进行精确作业。通过CFMIME Encoder压缩图像,可以在保持图像质量的同时减小文件尺寸,从而提高系统的响应速度和处理效率。
3. 无人车和自动导航系统

在物流和运输领域,无人车和自动导航系统需要实时处理大量来自工业相机的视觉数据。通过使用 CFMIME Encoder进行高效的图像压缩,可以加快图像的处理和分析速度,降低系统的延迟,提高导航的准确性和安全性。

  1. 远程监控

在石油、化工、电力等行业,工业相机常用于难以接近或危险区域的远程监控。通过 CFMIME Encoder对图像进行压缩,可以通过网络实时传输大量监控图像到控制中心,不仅节省了传输带宽,还能提高监控效率。

  1. 文档和图像存档

对于需要长期保存的工业设计图、技术图纸等图像文件,利用 CFMIME Encoder进行压缩,既能保证图像的可读性,又能显著减少存储空间的占用,便于数据的长期管理和快速检索。

总结

在工业应用中,CFMIME Encoder提供的压缩功能使得图像在保持必要质量的前提下,能够以更小的文件大小进行存储和传输,这对提升工业自动化和远程监控系统的效率和效果具有重要意义。这种技术的实施不仅优化了数据处理流程,也为行业用户带来了可观的成本节约和操作便利。

举报

相关推荐

0 条评论