在boost::线程中安全地更新cv::capturevideo帧
updating cv::capturevideo frame in a boost::thread safely
我想通过opengl2camera同时渲染。我想尽快刷新每一帧。为了更新这些帧,我在无限循环中使用了一个线程。
我的实际问题是,我的程序崩溃,如果我把那些相机的分辨率高。用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();
}
这确保在为该相机设置捕获时启动一个新线程。下面的代码由线程的exec部分运行,以实际获取帧。
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);
}
相关文章:
- 从C++本机插件更新Vector3数组
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 将"打开的CV图像"中的"颜色"转换为整数格式
- cmake更新缓存的变量
- 概念中的cv限定符需要表达式参数列表
- 更新到莫哈韦后出现cmath错误
- OpenMP:并行更新数组总是需要减少数组吗
- 为什么我的变量没有更新,我的 LED 没有亮起?
- 指针没有更新它在void函数内部指向的值
- 将CHW格式的浮点向量转换为cv::Mat
- 如何在c++中获取要更新的值
- 已修改的LinkedList未在文本文件本身中更新
- Qt:当QListView获得新条目时,如何更新QStringList
- 错误的cv::face FacemarkLBF实例化
- 更新的矢量元素不打印
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- 如何检查给定的参数是否为 cv::noArray()?
- 如何在ECS框架中更新组件数据和通知系统
- OpenCV - 在 NDK 更新后未定义对 'cv::CascadeClassifier::d etectMultiScale()' 的引用
- 在boost::线程中安全地更新cv::capturevideo帧