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