Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在boost::thread中安全更新cv::capturevideo帧_C++_Opencv_Boost_Thread Safety - Fatal编程技术网

C++ 在boost::thread中安全更新cv::capturevideo帧

C++ 在boost::thread中安全更新cv::capturevideo帧,c++,opencv,boost,thread-safety,C++,Opencv,Boost,Thread Safety,我想同时通过openGL 2camera进行渲染。我想尽快刷新每个帧。为了更新这些帧,我在无限循环中使用了一个线程 我的实际问题是,如果我把那些相机的分辨率调高,我的程序就会崩溃。 160分120秒没问题。但是如果我把最大分辨率设置为1920:1080,在崩溃之前,只有5到6次图像更新。 注意:崩溃前更新的次数并不总是相同的 我假设如果分辨率足够低,frame_L和frame_R的更改速度足够快,主循环和线程之间不会出现冲突 所以我想我的互斥锁没有做它应该做的事情。我该怎么办 我不是线程和变量安

我想同时通过openGL 2camera进行渲染。我想尽快刷新每个帧。为了更新这些帧,我在无限循环中使用了一个线程

我的实际问题是,如果我把那些相机的分辨率调高,我的程序就会崩溃。 160分120秒没问题。但是如果我把最大分辨率设置为1920:1080,在崩溃之前,只有5到6次图像更新。 注意:崩溃前更新的次数并不总是相同的

我假设如果分辨率足够低,frame_L和frame_R的更改速度足够快,主循环和线程之间不会出现冲突

所以我想我的互斥锁没有做它应该做的事情。我该怎么办

我不是线程和变量安全方面的专家

我的代码:

#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>

#include <opencv2/opencv.hpp>


boost::mutex m; //for an other thread
boost::mutex n;

cv::VideoCapture capture_L(0);
cv::VideoCapture capture_R(1);

cv::Mat frame_L;
cv::Mat frame_R;

void MyThreadFunction()
{
    while (1)
    {

        {
          boost::mutex::scoped_lock lk(n);

          if (capture_L.grab()){
             capture_L.retrieve(frame_L);
             cv::transpose(frame_L, frame_L);
          }

          if (capture_R.grab()){
            capture_R.retrieve(frame_R);
            cv::transpose(frame_R, frame_R);
          }
        }
    }

}

int main()
{

  capture_L.set(CV_CAP_PROP_FRAME_WIDTH, 160);
  capture_L.set(CV_CAP_PROP_FRAME_HEIGHT, 120);
  capture_R.set(CV_CAP_PROP_FRAME_WIDTH, 160);
  capture_R.set(CV_CAP_PROP_FRAME_HEIGHT, 120);

  boost::thread thrd(&MyThreadFunction);

  while(1)
  {
       [  use  frame_L and frame_R  ]  
  }  

}

这是我用于线程相机抓取的代码。它是摄影机对象的一部分,例如;每个摄像头都有自己的对象和捕捉线程

void Camera::setCapture(cv::VideoCapture cap)
{
    pthread_mutex_lock(&latestFrameMutex);
    videoCapture = cap;
    videoCapture.read(latestFrame);
    pthread_mutex_unlock(&latestFrameMutex);
    int iret = pthread_create(&cameraGrabThread,NULL,&Camera::exec,this);
}

void *Camera::exec(void* thr)
{
   reinterpret_cast<Camera *> (thr)->grabFrame();
}

首先;怎么撞车?你的错误是什么?您使用的操作系统对于摄像头和线程,这可能会也将产生不同的效果。在windows 8.1上,崩溃表明…exe已停止工作问题导致程序停止正常工作。Windows将关闭该程序并通知您是否有可用的解决方案在调试时,当我将framecamera图像应用到纹理时,可能是图像的大小太大;我在高分辨率拍摄两台相机时遇到了很多问题。USB总线可能并不总是能够处理它。
void *Camera::grabFrame()
{
    while(videoCapture.isOpened())
    {
        pthread_mutex_lock(&latestFrameMutex);
        if(!videoCapture.read(latestFrame))
            std::cout << "Unable to read frame" << std::endl;
        pthread_mutex_unlock(&latestFrameMutex);

        usleep(8000); // Sleep 8ms
    }
}
cv::Mat Camera::getLatestFrame()
{
    while (getMilisecSinceLastCapture() < 35) //Enforce min time of 35 ms between frame requests.
    {
        usleep(5000);
    }
    pthread_mutex_lock(&latestFrameMutex);
    cv::Mat result = latestFrame.clone();
    pthread_mutex_unlock(&latestFrameMutex);
    return result.clone();
}
void Camera::setImageSize(const cv::Size& size)
{    
    pthread_mutex_lock(&latestFrameMutex);
    videoCapture.set(CV_CAP_PROP_FRAME_HEIGHT, size.height);
    videoCapture.set(CV_CAP_PROP_FRAME_WIDTH, size.width);
    pthread_mutex_unlock(&latestFrameMutex);
}