Компиляция программы для использования камеры Basler - PullRequest
2 голосов
/ 03 октября 2019

Я пытаюсь получить программу C ++ для захвата изображений с помощью камеры Basler для работы. Я получил код от производителя, и он должен был быть «очень простым в использовании», однако связывание его стало кошмаром. Мои C ++ времена в прошлом (только с использованием Matlab в последнее время), поэтому я могу сделать какую-то глупую ошибку, но, пожалуйста, просветите меня:

Код выглядит так:

// Include files to use the PYLON API.
#include <pylon/PylonIncludes.h>
#ifdef PYLON_WIN_BUILD
#    include <pylon/PylonGUI.h>
#endif

// Namespace for using pylon objects.
using namespace Pylon;
using namespace GenApi;


#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/video/video.hpp>
//#include <opencv2/videoio.hpp>

using namespace cv;




// Namespace for using cout.
using namespace std;

#include <stdio.h>
#include "kbhit.h"

#include <sys/stat.h>  // for checking the file size
#include <sstream>

// Number of images to be grabbed.
//static const uint32_t c_countOfImagesToGrab = 100;




int main(int argc, char* argv[])
{
    // The exit code of the sample application.
    int exitCode = 0;

    // Automagically call PylonInitialize and PylonTerminate to ensure the pylon runtime system
    // is initialized during the lifetime of this object.
    Pylon::PylonAutoInitTerm autoInitTerm;
    VideoWriter cvVideoCreator;
    struct stat statbuf;
    string filenameBase = "/opt/PylonTestAVI";
    uint filecounter = 1;
    string filename = "";

    ... (and so on)

Iя пытаюсь скомпилировать его, используя следующее:

g++ GrabV3.cpp -I/opt/pylon5 -I/opt/pylon5/include -I/usr/local/include -I/usr/include/ -L/opt/pylon5/lib64 

Здесь / opt / pylon5 - собственная библиотека Баслера и / usr / local / include ссылки на папку opencv4.

Я получаю страницудлинный список сообщений об ошибках - начало выглядит следующим образом GrabV3.cpp :(. text + 0x2a5): неопределенная ссылка на cv::VideoWriter::VideoWriter()' GrabV3.cpp:(.text+0x32a): undefined reference to Pylon :: CTlFactory :: GetInstance () 'GrabV3.cpp :(. text + 0x346): неопределенная ссылка на Pylon::CDeviceInfo::CDeviceInfo()' GrabV3.cpp:(.text+0x370): undefined reference to Pylon :: CInstantCamera :: CInstantCamera (Pylon :: IPylonDevice , Pylon :: ECleanup) 'GrabV3.cpp :(. text + 0x38e): неопределенная ссылка на Pylon::CInstantCamera::Open()' GrabV3.cpp:(.text+0x39d): undefined reference to Pylon ::CInstantCamera :: GetNodeMap () 'GrabV3.cpp :(. Text + 0x3cb): неопределенная ссылка на GenICam_3_1_Basler_pylon::gcstring::gcstring(char const*)' GrabV3.cpp:(.text+0x41b): undefined reference to GenICam_3_1_Basler_pylon :: gcstring :: ~ gcstring ()' GrabV3.cpp :(. Text + 0x465): неопределенная ссылка на GenICam_3_1_Basler_pylon::gcstring::gcstring(char const*)' GrabV3.cpp:(.text+0x488): undefined reference to GenICam_3_1_Basler_pylon :: gcstring :: ~ gcstring () 'GrabV3.cpp :(. Text + 0x4af): неопределенная ссылка на GenICam_3_1_Basler_pylon::gcstring::gcstring(char const*)' GrabV3.cpp:(.text+0x4ff): undefined reference to GenICam_3_1_Basler_pylon :: gcstring :: ~ gcstring () 'GrabV3.cpp :(. Text + 0x526): неопределенная ссылка на GenICam_3_1_Basler_pylon::gcstring::gcstring(char const*)' GrabV3.cpp:(.text+0x576): undefined reference to GenICam_3_1_Basler_pylon :: gcstring :: ~ gcstring ()' GrabV3.cpp :(. + 0 + text + 0): неопределенная ссылка на `cv :: VideoWriter :: open (cv :: String const &, int, double, cv :: Size_, bool) '*

, поэтому, очевидно, ничего не работает, начиная с cv: VideoWriter() функция, являющаяся частью стандартного OpenCV (которую я установил с помощью этого руководства: https://cv -tricks.com / installation / opencv-4-1-ubuntu18-04 / ).

Так что я потерян здесь - уже потратил около суток, пытаясь заставить его работать. Может кто-нибудь помочь?

1 Ответ

0 голосов
/ 03 октября 2019

Хорошо, предложение Марка решило проблему с линковкой. Однако, поскольку программное обеспечение все еще не скомпилировано, и мы все еще находимся в теме «Компиляция программы для использования камеры Basler», я продолжу с проблемой области действия:

g ++ $ (pkg-config --cflags --libs opencv4) GrabV3.cpp -I / opt / pylon5 / include -I / opt / pylon5 / include / pylon -L / opt / pylon5 / lib64 -L / opt / pylon5 / include / pylon

теперь выдает следующую ошибку:

 GrabV3.cpp: In function ‘int main(int, char**)’:
  GrabV3.cpp:84:32: error: ‘CV_FOURCC’ was not declared in this scope
  cvVideoCreator.open(filename,CV_FOURCC('D','I','V','X'),20,FrameSize,true);

После «и так далее» (см. Мой первый пост) код продолжается следующим образом:

 try
{
    // Create an instant camera object with the camera device found first.
    CInstantCamera camera( CTlFactory::GetInstance().CreateFirstDevice());

    camera.Open();

    INodeMap& nodeMap = camera.GetNodeMap();
    CEnumerationPtr TestImageSelector = nodeMap.GetNode("TestImageSelector");
    TestImageSelector->FromString("Testimage4");

    CIntegerPtr Width = nodeMap.GetNode("Width");
    CIntegerPtr Height = nodeMap.GetNode("Height");
    Size FrameSize = Size(Width->GetValue(),Height->GetValue());
    stringstream s ;
    s<<"_" ;
    s<< filecounter;
    filename = filenameBase;
    filename += s.str() + ".avi";

    //cvVideoCreator.open("``/opt/PylonTest_DIVX.avi",CV_FOURCC('M','P','4','2'),20,FrameSize,true);
    cvVideoCreator.open(filename,CV_FOURCC('D','I','V','X'),20,FrameSize,true);
    //cvVideoCreator.open("/opt/PylonTest.avi",CV_FOURCC('M','J','P','G'),20,FrameSize,true);


    // Print the model name of the camera.
    cout << "Using device " << camera.GetDeviceInfo().GetModelName() << endl;

    // The parameter MaxNumBuffer can be used to control the count of buffers
    // allocated for grabbing. The default value of this parameter is 10.
    camera.MaxNumBuffer = 5;
    CImageFormatConverter fc;
    fc.OutputPixelFormat = PixelType_BGR8packed;
    CPylonImage image;

    // Start the grabbing of c_countOfImagesToGrab images.
    // The camera device is parameterized with a default configuration which
    // sets up free-running continuous acquisition.
    camera.StartGrabbing();

    // This smart pointer will receive the grab result data.
    CGrabResultPtr ptrGrabResult;

CV_FOURCC ('D', 'I', 'V', 'X') - это функция INLINE, определенная в /usr/include/opencv2/videoio/videoio_c.h, которой сейчас нетобласть действия по какой-то причине.

Я пытался связать его брутфорс, включив

#include "/usr/include/opencv2/videoio/videoio_c.h"

, но это привело к полному нарушению связи. Спасибо за @Mark для того, чтобы получить меня так далеко;как дальше отсюда?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...