Dalsa线扫相机-二次开发-QT-C++ 可用Demo(一)

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

 效果展示

       Dalsa线扫描相机的二次开发,因为官方只有MFC和命令行版本的,我需要使用QT进行开发,于是自己花时间研究,然后写了一个,效果如下:

dalsa线扫相机,数码相机,c++,开发语言,相机,qt

        可能GIF动图有点模糊,在图片中,上面为实时画面,我使用的是4096*128分辨率,然后使用手机的闪光灯在相机旁边摇晃,加上没有调焦调距,效果确实是如此。下面是实时拼接的图,将结果缩小旋转90度,然后依次拼接起来,就是下面拼接图片的效果。

        拼接图的右边那个黑框是截图时候参数没有设置好,后面已经改好了。

经验汇总

1. 大家参考的时候,记得对应自己的相机参数,包括:品牌、灰度/彩色、相机实际分辨率、网口/采集卡相机、软件版本等信息。

2. 我的版本是:

        相机:HL-FM 采集卡版本灰度相机

        SDK版本为:SaperaLTSDKSetup_8.60、

        采集卡驱动为:xtium2-clhs_fx8lc_110010122、

        QT版本:5.12

        编译器:MSVC 2017 64bit

        当然,实际只要版本差不多就行,我后面会提供我这个版本的软件驱动。

3. 我自己开发的步骤为:

  • 安装相机驱动和SDK 
  • 打开官方的 “Sapera CamExpert” 软件
  • 根据压缩包里面的 “HL-FM相机使用说明” 文件,进行相关配置,记得分辨率要调为自己的分辨率,不要完全按照文档来。点击 grab,拿着灯光在相机前晃,如果可以显示画面就正常。
  • dalsa线扫相机,数码相机,c++,开发语言,相机,qt
  • 如上所示,就表示正常,因为我是灰度相机,就选择第一个了。
  • 点击这个软件的左上角 “file”  “save  as ” ,然后保存,如下图所示:
  • dalsa线扫相机,数码相机,c++,开发语言,相机,qt
  • 上面的路径要记住,如果记不住,就点击 “Select Custom Directory”,自己保存在其他位置。这个很重要!!! 因为程序会使用这个配置文件,你必须记住路径,或者放在容易找到的路径才行!!!
  • 关闭软件(一定要关闭,因为会占用端口),打开 “ C:\Program Files\Teledyne DALSA\Sapera” ,这个是官方软件路径。会发现这么多文件夹。下面是解释:
  • dalsa线扫相机,数码相机,c++,开发语言,相机,qt
  • 如果是MFC开发者,那爽了,直接参考和复制Demos文件夹的代码即可。如果是QT的开发者,一般来说,开发起来就很有难度了,因为里面有很多很多的坑,至少我之前在其他地方下载的代码还没跑起来过,要么就需要配置opencv,那样太麻烦了。
  • (想偷懒的,下面的步骤可以不看,直接去看我的代码即可)
  • 我自己首先是参考了'Examples'文件夹的 'Class' 的 'GrabConsole' 示例,记得需要使用 VS2017和2017之前的版本,之后的版本很容易出问题。
  • 在官方软件路径的CamFiles文件夹里面新建User,将刚刚保存的配置文件放进去。
  • 看一下 'Examples'文件夹的“Binaries”文件夹里面的 “GrabCPP.exe”,运行一下,看一下官方案例的效果。需要依次输入1、 1 、1,就会弹出窗口,实时显示画面。
  • 我最开始运行官方的Demo,发现跑不起来,重装了一次就可以了。然后移植到QT,发现一样的代码,就是跑不起来,经过多次修改,测试需要MSVC 2017编译器。这里面坑很多,想尝试的可以自己去踩一遍这些坑,但是呢,我把很多需要的坑已经踩完了,大家也可以直接参考后面的代码即可。

4. 创建QT测试项目

  • 注意:这里的Demo是在main文件里面的,只是一个测试使用的。提供大家以后测试参考
  • 想偷懒的,可以跳过这一步,去看下面已经初步封装好的代码。
  • 将官方软件路径里面的这三个文件夹:Classes、Include、Lib文件夹,直接复制拖进项目文件夹里面来,然后配置好pro路径。
  • dalsa线扫相机,数码相机,c++,开发语言,相机,qt
  • pro文件代码参考:就是加入main.cpp和那三个文件夹,其他的测试过程可不加。
  • QT       += core gui
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    CONFIG += c++11
    
    # The following define makes your compiler emit warnings if you use
    # any Qt feature that has been marked deprecated (the exact warnings
    # depend on your compiler). Please consult the documentation of the
    # deprecated API in order to know how to port your code away from it.
    DEFINES += QT_DEPRECATED_WARNINGS
    #DEFINES += SAPERA_DOT_NET
    DEFINES += COR_WIN64
    
    #QMAKE_CXXFLAGS += -fno-case-insensitive
    QMAKE_CXXFLAGS += -fno-code-hoisting
    
    # You can also make your code fail to compile if it uses deprecated APIs.
    # In order to do so, uncomment the following line.
    # You can also select to disable deprecated APIs only up to a certain version of Qt.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    SOURCES += \
        main.cpp 
    
    
    
    # Default rules for deployment.
    qnx: target.path = /tmp/$${TARGET}/bin
    else: unix:!android: target.path = /opt/$${TARGET}/bin
    !isEmpty(target.path): INSTALLS += target
    
    
    win32: LIBS += -L$$PWD/Lib/Win64/ -lSapClassBasic
    win32: LIBS += -L$$PWD/Lib/Win64/ -lcorapi
    
    INCLUDEPATH += $$PWD/Include
    DEPENDPATH += $$PWD/Include
    
    INCLUDEPATH += $$PWD/Classes/Basic
    DEPENDPATH += $$PWD/Classes/Basic
    
    
  • 测试Demo源码:
  • 
    #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>
    #include <QApplication>
    using namespace std;
    
    SapManager* m_pManager;
    SapAcquisition* m_Acquisition;
    SapBufferWithTrash* m_Buffers;
    SapTransfer* m_Xfer;
    SapView* m_View;
    SapAcqDevice *m_AcqDevice;
    static int framcount = 0;
    BYTE *pData;
    
    static void XferCallBack(SapXferCallbackInfo* pInfo)
    {
        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 main(int argc, char** argv)
    {
        //QApplication a(argc, argv);
    
        char* m_SerName = new char[MAX_PATH];//采集卡名称
        char*    configFilename = new char[MAX_PATH];
        SapBuffer sapBuffer;
        int flag = 0;
        string ccf_path = "C:\\Program Files\\Teledyne DALSA\\Sapera\\CamFiles\\User\\FrameGrabber.ccf";
        uchar *imgData = new uchar[150 * 100/1.75*7000];
    
    
        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",configFilename);
            cout << "Open " << m_SerName << " Failed!" << endl;
            return 0;
        }
    
    
        //开始采集
        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\\bmp\\" << framcount << ".bmp";
                std::string name = ss.str();
                const char* savename = name.c_str();
                QImage image(4096 , 128, QImage::Format_Grayscale8);
                m_Buffers->Clear();
                if (!m_Xfer->IsGrabbing())
                        m_Xfer->Grab();
                // 保存文件:
                // m_Buffers->Save(savename, "-format bmp");
                //m_Mats.push_back(m_Mat);
                framcount++;
    
                if (framcount > int(1000))
                {
                    framcount = 0;
                    cout << "Grab Finished" << endl;//停止采集
                    m_Xfer->Freeze();
                    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;
    
    
        //return a.exec();
        return 0;
    }

    其中 ccf_path  路径需要配置为自己刚刚保存的路径,然后路径中需要使用两个\ 来分割。m_Buffers->Save(savename, "-format bmp"); 这行代码我注释起来了,因为会保存文件,想看保存文件的,可以打开注释,路径在D盘的test/bmp路径下,记得别跑太长时间,因为几秒钟保存的图片文件就有好几个G那么大了。

  • 如果可以跑,大家可以使用这个代码来改写为自己的类。下面是我自己初步封装的QT的线程类,大家也可以修改。

5. 我自己封装的线程类:

        1. 新建 SapCameraDev 的类,继承自 Qthread,头文件源码如下:

#ifndef SAPCAMERADEV_H
#define SAPCAMERADEV_H

#include "SapClassBasic.h"

#include <QObject>
#include <QThread>
#include <iostream>
#include <conio.h>
#include <string>
#include <vector>
#include <stdio.h>
#include <QImage>
#include <io.h>
#include <SapTransfer.h>

using namespace std;

class SapCameraDev : public QThread
{
    Q_OBJECT
public:
    explicit SapCameraDev(QObject *parent = nullptr);
    ~SapCameraDev();
    void setMax(int v);
    static void XferCallBack(SapXferCallbackInfo* pInfo);
    bool initDevice(char* m_serverName, const char*ccfpath);
    void setStopFlag(bool flag);
    void setSaveFlag(bool flag);
    void setFreezeFlag(bool flag);
    void setCcf_path(QString s);
    BYTE *getpData();
    // static SapCameraDev* instance;
    // static SapCameraDev* getSapCameraDevInstance()
    // {
    //     if (instance == nullptr)
    //     {
    //         instance = new SapCameraDev();
    //     }
    //     return instance;
    // }

signals:
    // void getNewImage(QImage image);          // 接受到新信号
    void getNewImage(BYTE *pData);
    void getNewImage_Image(QImage );
    void imageOK(bool flag);

private:
    void run() override;


private:

    string saveImagePath = string("D:\\test\\bmp\\");
    string ccf_path = string("C:\\Program Files\\Teledyne DALSA\\Sapera\\CamFiles\\User\\FrameGrabber.ccf");
    int max = 1000;
    bool isStop = false;
    bool isSave = false;
    bool isFreeze = false;  // 停止

    SapManager* m_pManager;
    SapAcquisition* m_Acquisition;
    SapBufferWithTrash* m_Buffers;
    SapTransfer* m_Xfer;
    SapView* m_View = nullptr;
    SapAcqDevice *m_AcqDevice;
    int framcount = 0;
    BYTE *pData;
    uchar *imgData = new uchar[150 * 100/1.75*7000];
};

#endif // SAPCAMERADEV_H

        2. SapCameraDev 的cpp文件源码如下:

#include "sapCameraDev.h"

//SapCameraDev* SapCameraDev::instance = nullptr;
//BYTE *temp_pData;

void SapCameraDev::XferCallBack(SapXferCallbackInfo* pInfo)
{
//     printf("XferCallBack\n");
//     SapCameraDev* temp = getSapCameraDevInstance();
//     if(temp){
//         QImage image(4096 , 128, QImage::Format_Grayscale8);
//         memcpy(image.bits(), temp_pData, 4096 * 128);
//         emit temp->getNewImage_Image(image);
//     }
}
bool SapCameraDev::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((SapBuffer*)m_Buffers, SapHwndAutomatic);
       m_Xfer = new SapAcqToBuf(m_Acquisition, (SapBuffer*)m_Buffers, SapCameraDev::XferCallBack);
    }

    if (m_Acquisition && !*m_Acquisition && !m_Acquisition->Create()) return FALSE;

    if (m_Buffers)
    {
        if (!m_Buffers->Create())
        {
            return FALSE;
        }
        m_Buffers->Clear();
    }

    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;
}
SapCameraDev::SapCameraDev(QObject *parent)
    :QThread(parent)
{

}

void SapCameraDev::setStopFlag(bool flag)
{
    isStop = flag;
}

void SapCameraDev::setSaveFlag(bool flag)
{
    isSave = flag;
}

void SapCameraDev::setFreezeFlag(bool flag)
{
    isFreeze = flag;
}

void SapCameraDev::setCcf_path(QString s)
{
    ccf_path = s.toStdString();
}

BYTE * SapCameraDev::getpData()
{
    return pData;
}



SapCameraDev::~SapCameraDev()
{
    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->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 SapCameraDev::setMax(int v)
{
    max = v;
}

void SapCameraDev::run()
{
    char* m_SerName = new char[MAX_PATH];//采集卡名称
    char* configFilename = new char[MAX_PATH];
    int flag = 0;
    //vector<cv::Mat> m_Mats;

//    cv::Mat m_Mat_all = cv::Mat::zeros(cv::Size(700,85700), CV_8U);

    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.c_str());
        cout << "Open " << m_SerName << " Failed!" << endl;
        return ;
    }


    //开始采集
    if (!m_Xfer->IsGrabbing())
    {
        m_Xfer->Grab();
        flag = 1;
        m_Buffers->GetAddress((void**)&pData);
        //temp_pData = pData;
        //int width = m_Buffers->GetWidth();
        //int height = m_Buffers->GetHeight();
    }
    std::cout << "Grab" << std::endl;
    while (true)
    {
        if (flag == 1)
        {
            //std::cout << "Grab" << std::endl;
            //Sleep(1);
            std::stringstream ss;
            ss << saveImagePath << framcount << ".bmp";
            std::string name = ss.str();
            const char* savename = name.c_str();
            QImage image(4096 , 128, QImage::Format_Grayscale8);

            if (isFreeze)
            {
                m_Xfer->Freeze();
                emit imageOK(false);
            }else{
                //m_Buffers->Clear();
                m_Xfer->Grab();

                // 传递QT图片信号
                // memcpy(image.bits(), pData, 4096 * 128);
                // emit getNewImage_Image(image);

                emit getNewImage(pData);
                QThread::usleep(1000);
            }

            if(isSave){
                m_Buffers->Save(savename, "-format bmp");
                framcount++;
            }

            if(isStop){
                framcount = 0;
                cout << "Grab Finished" << endl;//停止采集
                m_Xfer->Freeze();
                break;
            }

            if (framcount > max)
            {
                framcount = 0;
                isSave = false;
                cout << "save Finished" << endl;//停止采集
                //m_Xfer->Freeze();
                //break;
            }
        }
    }
}


        3. 为了更好的展示,我自己新建了一个界面:

dalsa线扫相机,数码相机,c++,开发语言,相机,qt

        4. mainwindow.h 源码:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QCheckBox>
#include <QTransform>
#include <QDebug>
#include <QPixmap>
#include <QPainter>
#include <QImage>
#include <QRect>
#include <QTimer>
#include "sapCameraDev.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    SapCameraDev *sap;
    QImage *sapImage;
    QImage *resultImage;
    //QImage *middleImage;
    QPixmap *pixmap;
    QTimer *showTimer;
    QPainter *painter;

    int offset_x = 0;

    bool isImageOK = false;
    bool isSplic = false;
};

#endif // MAINWINDOW_H

        5. mainwindow.cpp源码:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    sap = new SapCameraDev(this);
    
    // 绑定按钮的信号
    connect(ui->pushButton_start,&QPushButton::clicked,this,[=](){
        sap->setStopFlag(false);
        sap->setFreezeFlag(false);
        sap->start();
    });
    connect(ui->pushButton_freeze,&QPushButton::clicked,this,[=](){    //
        sap->setFreezeFlag(true);
    });
    connect(ui->pushButton_stop,&QPushButton::clicked,this,[=](){
        sap->setStopFlag(true);
    });
    connect(ui->pushButton_continue,&QPushButton::clicked,this,[=](){
        sap->setFreezeFlag(false);
    });
    connect(ui->checkBox_saveFile,&QCheckBox::stateChanged,this,[=](int flag){
        sap->setSaveFlag(flag);
    });
    connect(ui->checkBox_splic,&QCheckBox::stateChanged,this,[=](int flag){
        isSplic = flag;
        resultImage->fill(Qt::transparent);
    });

    // connect(sap,&SapCameraDev::imageOK,this,[=](bool flag){
    //     isImageOK = flag;
    //     offset_x = 0;
    // });

    // 实时图像:
    sapImage = new QImage(4096, 128, QImage::Format_Grayscale8);
    // 拼接图像:
    resultImage = new QImage(1024,256,QImage::Format_Grayscale8);
    resultImage->fill(Qt::transparent); // 透明色
    painter = new QPainter(resultImage);

    ui->label->setScaledContents(true); // 允许自动缩放
    ui->label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); // 水平方向上自动伸展,垂直方向上保持固定高度

    ui->label_2->setScaledContents(true); // 允许自动缩放
    ui->label_2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); // 水平方向上自动伸展,垂直方向上保持固定高度
    ui->label_2->setPixmap(QPixmap::fromImage(*resultImage));
    //ui->label->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); // 忽略大小策略

    // 接收线程类发送来的信号进行图片渲染:
    connect(sap,&SapCameraDev::getNewImage,this,[=](BYTE *pData){
        // 显示实时画面:
        memcpy(sapImage->bits(), pData, 4096 * 128);
        ui->label->setPixmap(QPixmap::fromImage(*sapImage));
        
        // 是否拼接:
        if(isSplic){
            // 显示拼接画面:
            // 旋转:
            QImage rotatedImage = sapImage->scaled(256, 8, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
            rotatedImage = rotatedImage.transformed(QTransform().rotate(90));

            if(offset_x<1024){
                painter->drawImage(offset_x,0,rotatedImage);
                offset_x += rotatedImage.width();
                ui->label_2->setPixmap(QPixmap::fromImage(*resultImage));
            }else{
                offset_x = 0;
            }

        }

    });

}

MainWindow::~MainWindow()
{
    delete ui;
    sap->quit();
}

        OK,撒花完结!!!

dalsa线扫相机,数码相机,c++,开发语言,相机,qt

        其实源码95%都已经给你们放出来了,有能力的自己已经可以做出来了,毕竟当时踩了很多坑,而且当时下载别人的案例,也花了一点小钱,而且他们的还运行不起来,我把我自己的源码放出来,收回一点成本可以吧。不求大富大贵,最起码回本啊,兄弟们,还望理解。

        

        额,不知道为什么,必须设置为免费的,还是0积分,晕死,我先看看如何设置再分享出来。

相关资源链接:

【免费】Dalsa线扫描相机资源分享(一)-安装驱动和配置说明资源-CSDN文库

【免费】Dalsa线扫描相机资源分享(二)-开发文档资源-CSDN文库

【免费】Dalsa线扫描相机资源分享(三)-简单的QT测试程序,未封装类资源-CSDN文库

参考文章:

Dalsa线扫相机SDK二次开发_dalsa相机二次开发-CSDN博客文章来源地址https://www.toymoban.com/news/detail-752028.html

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

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

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

相关文章

  • 线扫相机DALSA--采集卡Base模式设置

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

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

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

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

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

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

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

    2024年02月06日
    浏览(12)
  • 从零开始实现Dalsa线阵相机采图

    Dalsa相机一只,电源,如需使用编码器触发模块还需要准备增量式编码器输出信号,(AB,ABZ信号均可)。 电源接线:10接电源负极;15接电源正极; 编码器信号线: 1------Line 1+------A+ 2------Line 1-------A- 3------Line 2+------B+ 4------Line 2-------B- 如果不使用编码器触发,只需接好电源线

    2024年02月09日
    浏览(14)
  • Windows10下TELEDYNE DALSA相机连接电脑以及网卡配置教程

    右键相机,选择Scan Network 选择SHOW Status Dialog Box,出现发现的设备 设备显示为红色说明连接有问题,这里有两种解决办法,一种是以下文件中的中的以下章节进行配置 还有一种是直接通过修改网口ip来进行,步骤如下: 打开控制面板,选择网络和Internet 选择网络和共享中心

    2024年02月10日
    浏览(19)
  • Dalsa线阵相机说明(Linea Color GigESeries 2k and 4K)

    相机接口 相机DB15引脚定义 相机外型尺寸图 相机整体参数 传感器参数 最高采样帧率情况下每帧时间:1/45000 1000 1000=22us 传感器中感光单元的排列方式 双线性彩色相机基于Teledyne DALSA的双线性CMOS传感器,并设计为使得该双线传感器的第一行具有红色(R)和蓝色(B)交替像素

    2024年02月11日
    浏览(13)
  • Dalsa官方SDK- Sapera LT 8.0

    进入到dalsa官网找到Sapera LT 8.0版本进行下载,安装也是十分的简单除了选择安装路径部分自己斟酌一下,其他地方一路Next即可。 相机的上电 如果单纯只是相机上电是很简单的,接线图需要参照下图官方文档中已给出,将 10 和 15 插针插入电源正负极即可,注意输入电压不得超

    2024年03月21日
    浏览(11)
  • 【重明】机器视觉QT/C++实现工业相机二次开发框架

    工业相机二次开发是机器视觉行业必不可少的技能之一。 而如何实现一个框架,能够兼容所有工业相机二次开发,从而支持多种类型的工业相机,就是机器视觉行业的进阶技能了。 重明工业相机二次开发项目就是在实现相机二开框架的基础上,完成了海康工业相机的二次开

    2024年02月02日
    浏览(19)
  • 海康工业相机SDK连接demo,Qt界面显示

    在机器视觉开发过程中,经常使用工业相机采集图像,以下采用海康机器人提供的SDK开发demo,使用语言C++,界面显示使用的Qt。SDK来自MVS 3.1版本中附属的Development文件夹。完整的项目链接地址为: 海康工业相机SDK的Demo源代码C++版本 附录海康工业相机的命名方式: 海康工业相

    2024年02月13日
    浏览(15)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包