首页 > 解决方案 > cv::Mat 回退到 std::vector 问题

问题描述

目标是从 basler 相机(带有 pylon)读取图像到 opencv 矩阵,并std::vector使用该方法将其加载到容器中push_back()。我的尝试失败了,因为所有保存的元素都将是最后一个。所以如果我推回 295 元素,所有 295 图像将是相同的(最后一个)。我会写一个摘要代码:

    try
    {
       auto TestCam1 = interfaces::Basler::ICamera_Basler_USB3("21993673", true); 
       interfaces::ICamera* Camera1 = TestCam1.getCamera(); //We can use Basler_USB3 as an ICamera
       Camera1->open();
       cout << "Cam1 opened" << endl;

       static_cast<ICamera_Basler_USB3*>(Camera1)->Set_Sensor_Pixel_Format("BayerBG12");
       static_cast<ICamera_Basler_USB3*>(Camera1)->Set_Width(500);
       static_cast<ICamera_Basler_USB3*>(Camera1)->Set_Height(500);
       static_cast<ICamera_Basler_USB3*>(Camera1)->Set_Exposure_Auto(false);
       static_cast<ICamera_Basler_USB3*>(Camera1)->Set_Exposure(exp_val);
       static_cast<ICamera_Basler_USB3*>(Camera1)->Set_Enable_Acquisition_Frame_Rate(true);
       static_cast<ICamera_Basler_USB3*>(Camera1)->Set_Acquisition_Frame_Rate(20);

       unsigned int cam_width=static_cast<ICamera_Basler_USB3*>(Camera1)->Get_Width();
       unsigned int cam_height=static_cast<ICamera_Basler_USB3*>(Camera1)->Get_Height();


       cv::Mat cv_img1(cam_width, cam_height, CV_16UC3);
       std::vector<cv::Mat> video;


       bool first_run = true;


       Camera1->initGrabStream();

       while(1){

           cv_img1=Camera1->getLastFrameStream(); //give back frame_time and frame_num
           video.push_back(cv_img1);

           std::cout << "Buffer size: " << video.size() << std::endl;

           if (video.size() == 295 && first_run == true)
           {

               funtionToEvaluateRecordedVideo(video);
               first_run = false;
               video.erase(video.begin(), video.end());
           }
           else if (video.size() == 40 && first_run == false)
           {
               funtionToEvaluateRecordedVideo(video);
               video.erase(video.begin(), video.end());
           }



           // Here the interesting thing (and my problem) is that BOTH 
           // window shows the same image!
           cv::imshow("Camera disp", video[video.size()-1]*15);
           cv::imshow("Debug, buffer img1", video[0]*15);
           if(waitKey(1) > 0)
           {
               Camera1->close();
               break;
           }

       }
       Camera1->Stop_Recording();
   }
   catch (GenICam::GenericException &e)
   {
       // Error handling.
       cerr << "An exception occurred." << endl
       << e.GetDescription() << endl;
       exitCode = 1;
   }

总结问题:当前帧(从相机获得)推回到容器的末尾std::vector。由于某种原因,容器向量的所有元素都将是相同的,并且是最后一个。

标签: c++opencvcameravideo-processingpush-back

解决方案


推荐阅读