【发布时间】:2015-05-08 10:46:00
【问题描述】:
我有一个应用程序,它必须从视频中提取帧,稍微变换一个,大量变换一个,并同时在 GUI 中显示它们。在工作线程中,有一个 OpenCV 循环:
while(1) {
cv::VideoCapture kalibrowanyPlik;
kalibrowanyPlik.open(kalibracja.toStdString()); //open file from url
int maxFrames = kalibrowanyPlik.get(CV_CAP_PROP_FRAME_COUNT);
for(int i=0; i<maxFrames; i++) //I thought it crashed when finished reading the first time around
{
cv::Mat frame;
cv::Mat gray;
cv::Mat color;
kalibrowanyPlik.read(frame);
cv::cvtColor(frame, gray, CV_BGR2GRAY);
cv::cvtColor(frame, color, CV_BGR2RGB);
QImage image((uchar*)color.data, color.cols, color.rows,QImage::Format_RGB888);
QImage processedImage((uchar*)gray.data, gray.cols, gray.rows,QImage::Format_Indexed8);
emit progressChanged(image, processedImage);
QThread::msleep(50);
}
}
这就是框架在 GUI 中的放置方式
void MainWindow::onProgressChagned(QImage image, QImage processedImage) {
QPixmap processed = QPixmap::fromImage(processedImage);
processed = processed.scaledToHeight(379);
ui->labelHsv->clear();
ui->labelHsv->setPixmap(processed);
QPixmap original = QPixmap::fromImage(image); //debug points SIGSEGV here
original = original.scaledToHeight(379);
ui->labelKalibracja->clear();
ui->labelKalibracja->setPixmap(original);
}
RGB 图像总是崩溃,灰度图像永远不会崩溃(已测试)。为什么 RGB 图像会崩溃?
编辑:我刚刚发现,如果我将msleep(50) 更改为msleep(100),它会完美执行。但我不想那样。我需要每秒至少 25 帧,10 帧是不可接受的......为什么会导致 SIGSEGV
【问题讨论】:
-
不可能从您向我们展示的内容中说出来。但是,在此代码中可能发生段错误的唯一合理位置是 QImage image(...) 中的 (uchar*)color.data 指针。很可能 color.cols、color.rows 与 color.data 后面的内存大小不一致。但这只是一种猜测。
-
@Greenflow 我不知道要向您展示什么,实际上(还)没有其他东西可以对这些图像做任何事情编辑:添加更多信息
-
我只能告诉你。尝试注释掉 QImage image((uchar*)color.data, color.cols, color.rows,QImage::Format_RGB888); 还是崩溃?你说它只有在涉及颜色时才会崩溃。这个函数是我看到的唯一一个,它使用指针。所以也许 QImage::Format_RGB888 是错误的。可能您的颜色格式实际上更小,并且 QImage 尝试访问 color.data 之外的数据。
-
RGB888 一定是错的。我已经用 jpg 文件替换了 original 并将 msleep 设置回 50,它循环良好。编辑:RGB888 是唯一不会在第 1 帧上使应用程序崩溃
-
视频中的帧通常不是 RGB 或 BGR...它们通常是 yuv 格式。
标签: c++ qt opencv segmentation-fault