Dalsa线扫相机SDK二次开发

这篇具有很好参考价值的文章主要介绍了Dalsa线扫相机SDK二次开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#include <iostream>
#include"SapClassBasic.h"
#include <SapBuffer.h>
#include<conio.h>
#include <string>
#include <vector>
#include <io.h>
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <QImage>
using namespace std;

SapManager* m_pManager;
SapAcquisition* m_Acquisition;
SapBufferWithTrash* m_Buffers;
SapTransfer* m_Xfer;
SapView* m_View;
SapAcqDevice *m_AcqDevice;

static void XferCallBack(SapXferCallbackInfo* pInfo)
{
	m_View->Show();
}
bool initDevice(char* m_serverName, const char*ccfpath)
{
	SapLocation loc(m_serverName, 0);//初始化采集卡

	m_Acquisition = new SapAcquisition(loc, ccfpath);
	m_Buffers = new SapBufferWithTrash(3, m_Acquisition);
	m_Xfer = new SapAcqToBuf(m_Acquisition, m_Buffers, XferCallBack, m_View);
	m_View = new SapView(m_Buffers, SapHwndAutomatic);
	if (m_Acquisition && !*m_Acquisition && !m_Acquisition->Create()) return FALSE;
	if (m_Buffers && !*m_Buffers)
	{
		if (!m_Buffers->Create())
		{
			return FALSE;
		}
		m_Buffers->Clear();
	}
	if (m_View && !*m_View && !m_View->Create())
	{
		return FALSE;
	}

	// Set next empty with trash cycle mode for transfer
	if (m_Xfer && m_Xfer->GetPair(0))
	{
		if (!m_Xfer->GetPair(0)->SetCycleMode(SapXferPair::CycleNextWithTrash))
		{
			return FALSE;
		}
	}
	// Create transfer object
	if (m_Xfer && !*m_Xfer && !m_Xfer->Create())
	{
		return FALSE;
	}
	return true;
}

int main(int argc, char** argv)
{
	char* m_SerName = new char[MAX_PATH];//采集卡名称
	SapBuffer sapBuffer;
	int framcount = 0;
	int flag = 0;
	string ccf_path = "D:\\test\\ds\\ds\\2023_06_29.ccf";
	//vector<cv::Mat> m_Mats;
	BYTE *pData;
	uchar *imgData = new uchar[150 * 100/1.75*7000];

	cv::Mat m_Mat_all = cv::Mat::zeros(cv::Size(700,85700), CV_8U);
	int SerCount = m_pManager->GetServerCount(SapManager::ResourceAcq);
	m_pManager->GetServerName(0, SapManager::ResourceAcq, m_SerName);//获取采集卡名称
	m_pManager->GetServerType(m_SerName);//获取采集卡类型
	//初始化设备
	if (initDevice(m_SerName, ccf_path.c_str()))
	{
		cout << "Open " << m_SerName << " Success!" << endl;
	}
	else
	{
		cout << "Open " << m_SerName << " Failed!" << endl;
	}
	//开始采集
	if (!m_Xfer->IsGrabbing())
	{
		m_Xfer->Grab();
		flag = 1;
		m_Buffers->GetAddress((void**)&pData);
		//int width = m_Buffers->GetWidth();
		//int height = m_Buffers->GetHeight();
	}
	while (true)
	{
		if (flag == 1)
		{
			std::cout << "Grab" << std::endl;
			//Sleep(200);
			std::stringstream ss;
			ss << "D:\\test\\ds\\ds\\bmp1\\" << framcount << ".bmp";
			std::string name = ss.str();
			const char* savename = name.c_str();
			//cv::Mat m_Mat = cv::Mat::zeros(cv::Size(640, 480), CV_8U);
			//QImage image(640, 480, QImage::Format_Grayscale8);
			//m_Xfer->Freeze();
			//memcpy(m_Mat.data, pData, 640 * 480);
			memcpy(imgData + framcount*7000,pData,7000);
			//cv::imwrite(name,m_Mat);
			//memcpy(image.bits(), pData, 640 * 480);
			//image.save(savename);
			//m_Buffers->Save(savename, "-format bmp");
			//m_Buffers->Clear();
			//m_Xfer->Grab();
			//m_Buffers->Save(savename, "-format bmp");
			//m_Mats.push_back(m_Mat);
			framcount++;
			if (framcount > int(150 * 100 / 1.75 - 1))
			{
				framcount = 0;
				cout << "Grab Finished" << endl;//停止采集
				m_Xfer->Freeze();
				for (int i = 0; i < int(150 * 100 / 1.75 - 1); i++)
				{
					cv::Rect roiRect(0, 10 * i,700, 10);
					cv::Mat img = cv::Mat::zeros(cv::Size(700,10), CV_8U);
					memcpy(img.data, imgData + i * 7000,7000);
					//std::stringstream ss;
					//ss << "D:\\test\\ds\\ds\\bmp1\\" << i << ".bmp";
					//std::string name = ss.str();
					//cv::imwrite(name, img);
					cv::Mat roi = m_Mat_all(roiRect);
					img.copyTo(roi);
					cv::imshow("1", m_Mat_all);
					cv::waitKey(0);
				}
				cv::imwrite("test.bmp", m_Mat_all);
				break;
			}
		}
	}
	delete imgData;
	// Destroy transfer object
	if (m_Xfer && *m_Xfer) m_Xfer->Destroy();
	if (m_View && *m_View) m_View->Destroy();
	if (m_Buffers && *m_Buffers) m_Buffers->Destroy();
	if (m_Acquisition && *m_Acquisition) m_Acquisition->Destroy();

	//Delete all pointer
	if (m_View) delete m_View;
	if (m_Buffers) delete m_Buffers;
	if (m_Xfer) delete m_Xfer;
	if (m_Acquisition) delete m_Acquisition;
}

要用回调函数取图:文章来源地址https://www.toymoban.com/news/detail-531507.html

#include <iostream>
#include"SapClassBasic.h"
#include <SapBuffer.h>
#include<conio.h>
#include <string>
#include <vector>
#include <io.h>
#include <opencv2/opencv.hpp>
#include <stdio.h>
using namespace std;

SapManager* m_pManager;
SapAcquisition* m_Acquisition;
SapBufferWithTrash* m_Buffers;
SapTransfer* m_Xfer;
SapView* m_View;
SapAcqDevice *m_AcqDevice;
BYTE *pData;
int framcount = 1;

static void XferCallBack(SapXferCallbackInfo* pInfo)
{
	cv::Mat m_Mat = cv::Mat::zeros(cv::Size(640, 480), CV_8U);
	memcpy(m_Mat.data, pData, 640 * 480);
	std::stringstream ss;
	ss << "D:\\test\\ds\\ds\\bmp\\" << framcount << ".bmp";
	std::string name = ss.str();
	cv::imwrite(name,m_Mat);
	framcount++;
	//Sleep(100);
	//m_View->Show();
}
bool initDevice(char* m_serverName, const char*ccfpath)
{
	SapLocation loc(m_serverName, 0);//初始化采集卡

	m_Acquisition = new SapAcquisition(loc, ccfpath);
	m_Buffers = new SapBufferWithTrash(3, m_Acquisition);
	m_Xfer = new SapAcqToBuf(m_Acquisition, m_Buffers, XferCallBack, m_View);
	m_View = new SapView(m_Buffers, SapHwndAutomatic);
	if (m_Acquisition && !*m_Acquisition && !m_Acquisition->Create()) return FALSE;
	if (m_Buffers && !*m_Buffers)
	{
		if (!m_Buffers->Create())
		{
			return FALSE;
		}
		m_Buffers->Clear();
	}
	if (m_View && !*m_View && !m_View->Create())
	{
		return FALSE;
	}

	// Set next empty with trash cycle mode for transfer
	if (m_Xfer && m_Xfer->GetPair(0))
	{
		if (!m_Xfer->GetPair(0)->SetCycleMode(SapXferPair::CycleNextWithTrash))
		{
			return FALSE;
		}
	}
	// Create transfer object
	if (m_Xfer && !*m_Xfer && !m_Xfer->Create())
	{
		return FALSE;
	}
	return true;
}

int main(int argc, char** argv)
{
	char* m_SerName = new char[MAX_PATH];//采集卡名称
	SapBuffer sapBuffer;
	int flag = 0;
	string ccf_path = "D:\\test\\ds\\ds\\2023_06_29.ccf";
	vector<cv::Mat> m_Mats;
	
	cv::Mat m_Mat_all = cv::Mat::zeros(cv::Size(640, 4800), CV_8U);
	int SerCount = m_pManager->GetServerCount(SapManager::ResourceAcq);
	m_pManager->GetServerName(0, SapManager::ResourceAcq, m_SerName);//获取采集卡名称
	m_pManager->GetServerType(m_SerName);//获取采集卡类型
	cout << "Opening " << m_SerName << endl;
	//初始化设备
	if (initDevice(m_SerName, ccf_path.c_str()))
	{
		cout << "Open " << m_SerName << " Success!" << endl;
	}
	else
	{
		cout << "Open " << m_SerName << " Failed!" << endl;
	}
	//开始采集
	if (!m_Xfer->IsGrabbing())
	{
		m_Xfer->Grab();
		flag = 1;
		m_Buffers->GetAddress((void**)&pData);
		//int width = m_Buffers->GetWidth();
		//int height = m_Buffers->GetHeight();
	}
	while (true)
	{
		if (flag == 1)
		{
			std::cout << "Grab" << std::endl;
			//m_Mats.push_back(m_Mat);
			if (framcount > 1000)
			{
				framcount = 0;
				cout << "Grab Finished" << endl;//停止采集
				m_Xfer->Freeze();
				break;
			}
		}
	}

	// Destroy transfer object
	if (m_Xfer && *m_Xfer) m_Xfer->Destroy();
	if (m_View && *m_View) m_View->Destroy();
	if (m_Buffers && *m_Buffers) m_Buffers->Destroy();
	if (m_Acquisition && *m_Acquisition) m_Acquisition->Destroy();

	//Delete all pointer
	if (m_View) delete m_View;
	if (m_Buffers) delete m_Buffers;
	if (m_Xfer) delete m_Xfer;
	if (m_Acquisition) delete m_Acquisition;
}

到了这里,关于Dalsa线扫相机SDK二次开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • micropython 自制数码相机

    像头(CAMERA或WEBCAM)又称为电脑相机、电脑眼、电子眼等,是一种视频输入设备,被广泛的运用于视频 会议,安防系统  、图像采集系统、 环境监控 、工业现场过程控制 等方面。本实验用TPYBoard  v102以 及PTC06 串口摄像头模块DIY一个简易的照相机。 1.所用器材:    TPY

    2024年02月19日
    浏览(39)
  • 线扫相机DALSA--采集卡Base模式设置

    采集卡默认加载“1 X Full Camera Link”固件,Base模式首先要将固件更新为“2 X Base Camera Link”。 右键SCI图标,选择“打开文件所在的位置”,找到并打开SciDalsaConfig的Demo,如上图所示: 左键单击“获取相机”,稍等1-2分钟后提示“获取相机列表成功”; 获取相机列表成功后点

    2024年02月06日
    浏览(29)
  • 线扫相机DALSA--常见问题一:软件安装顺序

    1.软件安装顺序 先安装:Sapera_LT_SDK,后安装Xtium-CL MX4驱动。 2.初次安装CamExpert,重启电脑后未找到相机 Settings(搜索协议)配置完毕后,需点击Detect Camera(一键查找相机)按钮,搜索相机。第一次查找相机耗时会略长,后续打开CamExpert无需再Detect Camera,相机专家会按照搜索协议,

    2024年02月04日
    浏览(35)
  • 线扫相机DALSA--常见问题四:修改相机参数,参数保存无效情况

    该问题是操作不当,未按照正常步骤保存参数所致,相机为RAM机制,参数需保存在采集卡的ROM内。 保存参数步骤: ①首先将相机参数保存至User Set1; ②然后回到Board(采集卡)参数设置区,鼠标选中Basic Timing; ③最后鼠标点击相机专家菜单栏”Save”按钮即可完成参数保存。

    2024年02月06日
    浏览(30)
  • 线扫相机DALSA-Advanced Control(输出设置)

    (Q有答疑)康耐视智能相机Insight-药品检测 Line Sync Source(选择触发信号): ①None:表示关闭外触发,此时相机处于Free-Run(自由采集)模式; ②Internal Line Trigger:表示采集卡按照固定的频率发出行信号触发相机拍照,频率可在下面的”Internal Line Trigger Frequency(in HZ)”栏里设置; 注:

    2024年02月09日
    浏览(35)
  • 如何从数码相机恢复已删除的照片?

    “嗨,我删除了索尼数码相机中的所有照片。有什么办法可以让他们回来吗?” ——刘凯 我们经常从数码相机中删除照片。但是,如果我们误删除了一些重要的照片,则很难将其恢复,因为删除的照片可能会绕过回收站或垃圾箱,并且数码相机存储卡中没有“最近删除”文

    2024年04月09日
    浏览(44)
  • U盘/硬盘/数码相机RAW格式文件丢失的原因|恢复方法

    在现代数字生活中,U盘、硬盘以及数码相机等设备已经成为我们储存和分享数据的主要工具。然而,当这些设备中的RAW格式文件出现丢失时,我们可能会陷入困境。面对这种情况,了解如何恢复这些RAW格式文件就变得至关重要。 一、理解RAW格式文件 RAW格式文件是一种原始数

    2024年02月12日
    浏览(41)
  • 【计算机视觉:算法和应用】第二章:图像形成——2.3数码相机

    2.1几何图元与变换 2.2相机辐射成像        从一个或多个光源开始,在世界中一个或多个表面反射并通过相机镜头后,光最终到达成像传感器。到达传感器的光子是如何转换为我们在数字图像上看到的数字(R,G,B)值的呢?在这一节,我们构建了一个简单的模型来解释大多数

    2024年01月19日
    浏览(43)
  • 小米12s ultra,索尼xperia1 iv,数码相机 拍照对比

    首先说明所有的测试结果和拍摄数据我放到百度网盘了(地址在结尾) 我一直想知道现在的手机和相机差距有多大,到底差在哪儿? 先说结论: 1.1英寸的手机cmos(2022年) 6年前(2016)的入门款相机(m43画幅) 2.手机 不能换镜头,只能在特定的拍摄距离才能发挥出全部的实力.数码变焦画质损

    2024年02月09日
    浏览(68)
  • 海康威视相机SDK二次开发(JAVA语言)

    前言 有个项目需要使用java程序读取海康威视的相机图片。相机通过以太网连接服务器,部署在服务器上的java程序将相机拍摄的画面保存在指定路径下。 海康威视提供了sdk开发包,可以在官网中下载,windows和linux系统都有。但是开发包中给出的示例代码,无法满足实际需要,

    2024年04月29日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包