0

有人可以帮我显示来自相机的视频吗?来自相机的值存储在 QVector 中。可以这样显示吗?

4

2 回答 2

0

这是代码:

void MainWindow::slotDataUpdate(QVector<uint16_t> vec)
{
  ui->setupUi(this);

  double min = *std::min_element(vec.begin(), vec.end()); 
  double max = *std::max_element(vec.begin(), vec.end());  

  std::transform(vec.begin(), vec.end(), vec.begin(), std::bind2nd(std::plus<double>(), (-1)*min)); 

  int co = 65536/(max - min); 

  std::transform(vec.begin(), vec.end(), vec.begin(), std::bind2nd(std::multiplies<double>(), co));


  const QImage tmpImage((const uchar*)vec.data(), 160, 120, QImage::Format_RGB16);



  QByteArray data;
  QDataStream stream(&data, QIODevice::WriteOnly);

  stream << vec; //conversion from Q vector to QByteArray


    // QByteArray data = QByteArray::fromRawData(reinterpret_cast<const char*>(vec.constData()),sizeof(double)* vec.size()); //conversion from Q vector to QByteArray


    for (int i = 0; i < data.size(); i++)
    {
                std::cout << data[i] << " " << std::endl;
    }

    QImage tmpImage(160,120, QImage::Format_RGB32); //prazna slika pravih dimenzij
    QRgb *pixels=reinterpret_cast<QRgb*>(tmpImage.bits());


    for (size_t i=0;2*i<data.size();++i)
    {
        uchar pixel_msb=data[2*i+]; 
        pixels[i]=qRgb(pixel_msb, pixel_msb, pixel_msb);
    }


  QPixmap pixmap(QPixmap::fromImage(tmpImage));
  ui->label_img->setPixmap(pixmap.scaled(480,360,Qt::KeepAspectRatio));
}
于 2017-04-10T13:11:55.787 回答
0

RGB 源图像

直接转换是不可能的,除非QVector是内存映射文件。如果它包含原始字节(看起来如此),我建议QImage从原始数据构造 a 作为中间对象,然后将其转换为QPixmap

// assuming 'v' is the vector, and 'w' and 'h' the size of the image
const QImage tmpImage((const char*)v.data(), w, h, QImage::Format_RGB16);
QPixmap pixmap(QPixmap::convertFromQImage(tmpImage));

鉴于原始元素大小为 16 位,您可能需要QImage::Format_RGB16(for 5-6-5) 或QImage::Format_RGB555(for 5-5-5)。检查可用格式以获取更多选项。当然,假设是 RGB 图像。

灰度图像

如果您的图像只有一个颜色通道,那么您必须进行手动转换,因为 Qt 无法处理 16 位灰度图像。

简单的代码,但可能不会产生您想要的结果:

const QImage tmpImage((const char*)v.data(), w, h, QImage::Format_RGB16);
QPixmap pixmap(QPixmap::convertFromQImage(
  image.convertToFormat(QImage::Format::Format_Grayscale8)));

否则,您必须减少图像的深度。检查这个答案以获得更详细的实现。然而,这是一个缓慢的操作。如果您的 Qt 版本允许,请使用QImage::Format_Grayscale8目标图像而不是QImage::Format_RGB32链接答案中的建议,您将少写 3 倍的元素。

// 'image' is a QImage(w, h, QImage::Format_Grayscale)
//   if possible, re-use it on each frame to reduce construction overhead
// 'ptr' is the pointer to your 16-bits data (const short* ptr)
auto ptr = v.constData();
#pragma omp parallel for // if can use OpenMP you can gain some speed here
for (int ii = 0; ii < image.height(); ++ii) {
  auto scanLine = image.scanLine(ii);
  for (int jj = 0; jj < image.width(); ++jj, ++ptr, ++scanLine) {
    *scanLine = (unsigned char)(*ptr >> 8); // high byte, most significative bits
  }
}
于 2017-04-04T21:44:47.900 回答