gpt4 book ai didi

c++ - Mat队列中的访问冲突

转载 作者:行者123 更新时间:2023-12-03 13:01:58 28 4
gpt4 key购买 nike

我正在编写一个生产者/消费者代码,该代码从外部库中接收框架日期。
每个帧都从外部库中的回调函数中读取,该外部库在并行线程中运行,并将其插入Mat队列。我创建了另一个函数,该函数在另一个线程中运行,该线程读取并弹出每个帧。
问题是,当我尝试从队列中读取帧数据时,出现“访问冲突读取位置”。
我在全局声明这些变量:

queue<Mat> matQ;
OnFrameDataReceivedCB videoCB;
OnDeviceConnectStatusCB connectCB;
guide_usb_video_mode_e videoMode;
int width = 640;
int height = 512;
std::mutex mu;
这是用于推送每个帧数据的回调函数的代码:
void OnVideoCallBack(const guide_usb_frame_data_t data) //callback function
{
if (data.frame_rgb_data_length > 0)
{
// Send the displayed data directly
unsigned char* rgbData;
Mat frame;
Size size = Size(width, height);
rgbData = data.frame_rgb_data;
frame = Mat(size, CV_8UC3, rgbData, Mat::AUTO_STEP);


if (mu.try_lock())
{
printf("producing...\n");
matQ.push(frame);
printf("free producing\n");
mu.unlock();
}

}
}
这是从队列中读取的函数:
void OnHandleVideoData()
{
while (true)
{
try
{
if (matQ.size() <= 0)
{
chrono::milliseconds duration(200);
this_thread::sleep_for(duration);
continue;
}


if (mu.try_lock())
{
if (matQ.size() > 0)
{
printf("consuming...\n");
Size size = Size(width, height);
Mat frame = Mat(size, CV_8UC3);
frame = matQ.front().clone();
matQ.pop();
imwrite("frame.jpg", frame); //the access violation exception is thrown on this line
printf("free consuming\n");
mu.unlock();
}
}

}
catch (...)
{

}
}
}
我还尝试将未签名的char * rgbData数组而不是Mat放入队列,但是遇到了同样的错误。
我想念什么?

最佳答案

您应该尝试在接收到帧时立即克隆它:frame = Mat(size, CV_8UC3, rgbData, Mat::AUTO_STEP).clone();而不是那里:frame = matQ.front()/*.clone()*/;

关于c++ - Mat队列中的访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66262441/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com