dalsa sdk c++ 线扫相机驱动

camera.h 如下,需要dalsa的sdk库和opencv的库

// camera.h: 标准系统包含文件的包含文件
// 或项目特定的包含文件。

#pragma once
#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 <iostream>
#include <thread>

using namespace std;
using namespace cv;

#define IMAGE_CLOS 8192
#define IMAGE_ROWS 20000
#define IMAGE_SIZE IMAGE_CLOS*IMAGE_ROWS
#define CAMERA_CONFIG ".\\camera_config.ccf"
#define SVAE_IMAGE_PATH ".\\image"

int camera_init();//初始化相机
void camera_release();//释放相机
bool get_camera_status();//获取相机状态
void  get_camera_image(cv::Mat* get_image);//获取相机图片

int image_delete_black(Mat* p);
void  close_dalsa_camera(); // 关闭采集
void  open_dalsa_camera(); // 开始采集 
void abort_dalsa_camera();//中止采集
void wait_dalsa_camera(int time);//相机等待 time -- ms
void  save_camera_image();//保存图片



// TODO: 在此处引用程序需要的其他标头。

camera.cpp

// camera.cpp: 定义应用程序的入口点。
//
#include "camera.h"

static SapManager *m_pManager;
static SapAcquisition *m_Acquisition; //采集卡需要的类
static SapBufferWithTrash *m_Buffers; //实时处理时建立trash buffer用于存放转换数据(常用于处理速度跟不上数据采集速度时)
static SapTransfer *m_Xfer; //进行数据传输需要使用的类
static SapView *m_View;     //这个类是 Dalsa 根据 MFC 重新定义的一个显示类,基于 GUI 界面
static SapAcqDevice *m_AcqDevice;//相机类

static cv::Mat image(IMAGE_ROWS, IMAGE_CLOS, CV_8UC1);
cv::Mat cropped_img;

static void XferCallBack(SapXferCallbackInfo *pInfo) {

    BYTE pData;
    static int staticCount = 0;
    void *pDataAddr = &pData;
    int pitch = m_Buffers->GetPitch();
    int context = (int) pInfo->GetContext();
    int format = m_Buffers->GetFormat();
    printf("pitch %d context %d format %d\n", pitch, context, format);
    bool success = m_Buffers->GetAddress(staticCount, &pDataAddr);
    if (!success) {
        return;
    }
    int width = m_Buffers->GetWidth();
    int height = m_Buffers->GetHeight();
    //memset(&image, 0, image.cols * image.rows);
    image = cv::Mat::zeros(image.rows, image.cols, image.type());
    memcpy(image.data, pDataAddr, IMAGE_ROWS * IMAGE_CLOS);

    //cv:; namedWindow("image", cv::WINDOW_NORMAL);
    //cv::imshow("image", image);
    //cv::waitKey(0);
    //cv::destroyAllWindows();
    if (staticCount == 0) {
        staticCount = 1;
    } else if (staticCount == 1) {
        staticCount = 0;
    }

    // 保存文件:
    if (m_Buffers != NULL && m_Buffers) {
        image_delete_black(&image);
        success = m_Buffers->ReleaseAddress(pDataAddr);
        m_Buffers->Clear();
    }

    // static int mark = 0;
    //if (0 == mark)
    //{
    //    m_View->SetScalingMode(0.2, 0.2, TRUE);
    //    //mark = 1;
    //}
    //m_View->Show();
}


bool initDevice(char *m_serverName, const char *ccfpath) {

    printf("Sapera Console Grab Example (C++ version)\n");
    //采集卡索引
    SapLocation loc(m_serverName, 0);
    //获取采集卡上可用资源的数量,该函数返回一个整数值,表示可用资源的数量。
    if (SapManager::GetResourceCount(m_serverName, SapManager::ResourceAcq) > 0) {
        //初始化
        m_Acquisition = new SapAcquisition(loc, ccfpath);
        m_Buffers = new SapBufferWithTrash(2, m_Acquisition);
        //m_View = new SapView(m_Buffers, SapHwndAutomatic);
        m_Xfer = new SapAcqToBuf(m_Acquisition, m_Buffers, XferCallBack);/*,m_View*);*/
    }

    //下面是一些初始化的参数的判断
    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 image_delete_black(Mat *p) {
    Mat img = *p;
    for (int i = 0; i < img.rows; ++i) {
        double row_sum = 0;
        for (int j = 0; j < img.cols; ++j) {
            row_sum += static_cast<double>(img.at<uchar>(i, j)); // 计算当前行所有像素的和
        }
        double average = row_sum / img.cols; // 计算当前行的平均值

        if (average != 0.0) { // 如果平均值不等于0,则截取从这一行到图片底部的所有行
            cropped_img = img(cv::Rect(0, i, img.cols, img.rows - i));
            break; // 找到第一个非零均值行后即可停止循环
        }
    }
    return 0;
}


int camera_init()
{
    BYTE* pData;
    //cout << "Hello CMake." << endl;
    char* m_SerName = new char[MAX_PATH];//采集卡名称
    string ccf_path = CAMERA_CONFIG;

    //返回当前正在使用的采集卡的名称。此功能可用于确定摄像机正在使用的采集卡,并更改正在使用的采集卡。
    m_pManager->GetServerName(0, SapManager::ResourceAcq, m_SerName);

    //初始化设备
    if (initDevice(m_SerName, ccf_path.c_str())) {
        cout << "Open " << m_SerName << " Success!" << endl;
    }
    else {
        printf("m_SerName: %s \n", m_SerName);
        printf("configFilename: %s \n", ccf_path);
        cout << "Open " << m_SerName << " Failed!" << endl;
        return -1;
    }
    //开始采集
    if (!m_Xfer->IsGrabbing()) {
        std::cout << "Grab" << std::endl;
        m_Xfer->Grab();
        m_Buffers->GetAddress((void**)&pData);
        int width = m_Buffers->GetWidth();
        int height = m_Buffers->GetHeight();
    }
    m_Xfer->Freeze();
    return 0;
}

void  camera_release() {
    // 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;
}


void open_dalsa_camera() {
    if (!m_Xfer->IsGrabbing()) {
        m_Xfer->Grab();
    }
}

void close_dalsa_camera() {
    if (m_Xfer->IsGrabbing()) {
        m_Xfer->Freeze();
    }
}

void abort_dalsa_camera() {
    if (m_Xfer->IsGrabbing()) {
        m_Xfer->Abort();
    }
}

void wait_dalsa_camera(int time) {
    if (m_Xfer->IsGrabbing()) {
        m_Xfer->Wait(time);
    }
}

void save_camera_image() {
    std::stringstream save_path;
    static int framcount = 0;

    save_path.clear();
    save_path << SVAE_IMAGE_PATH << "\\print" << framcount << ".bmp";
    const char* savename = save_path.str().c_str();
    printf("savename : %s \n ", savename);
    framcount++;
    cv::imwrite(savename, cropped_img);
}

void get_camera_image(Mat *get_image) {
    if (cropped_img.empty())
    {
        return;
    }
    *get_image = cropped_img.clone();
}

bool get_camera_status() {
    if (m_Acquisition && m_Acquisition->IsSignalStatusAvailable())
    {
        return 1;
        std::cout << "camera connect  succeed " << std::endl;
    }
    else {
        return 0;
        std::cout << "camera connect fail" << std::endl;
    }

    
}

dasla的sdk代码网上太难搞了,陆陆续续搞了一个月,大家随便看看,还请指正。

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要进行dalsa线扫相机SDK的二次开发,首先需要搭建相应的开发环境。以下是具体的步骤: 1. 下载安装DAQ库:在dalsa官网上下载适用于相机型号的相应版本的DAQ库。安装DAQ库时,选择适当的操作系统以及语言和编译器。 2. 安装C编译器:如果您的操作系统中没有C编译器,需要安装一个合适的C编译器。常见的C编译器有GCC(GNU Compiler Collection)和Visual Studio等。 3. 创建工程:打开一个集成开发环境,如Visual Studio或者Code::Blocks等,创建一个新的C项目。 4. 配置项目:在项目的属性设置中,添加DAQ库的路径,指定C编译器的位置和其他必要的设置。 5. 引入头文件:在代码中引入DAQ库的头文件。通常,可以使用`#include`命令将头文件包含进来。 6. 编写代码:根据您的需求,编写相机控制、图像采集等相关功能的代码。 7. 构建和调试:编译代码,并在开发环境中进行调试。查看编译错误并修复,确保代码能够正确运行。 8. 部署应用程序:将生成的可执行文件或动态链接库部署到您的目标计算机上,并确保目标计算机上已安装了DAQ库。 总结:搭建dalsa线扫相机SDK的C开发环境需要下载安装DAQ库,安装C编译器,创建项目并配置相应属性,引入头文件,编写代码,构建和调试,最后部署应用程序到目标机器上。这样就可以进行dalsa线扫相机SDK的二次开发了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值