如何将IDS peak::ipl::Image或peak::core::Buffer转换为opencv cv::Mat?

bmp9r5qi  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(137)

我试着将peak::ipl::Image转换为cv::Mat,但没有找到方法。
本课题是用 C++ 实现的。

while(true){ 
   // Get buffer from device's DataStream. Wait 5000 ms. The buffer is automatically locked until it is queued again. 
   const auto buffer = dataStream->WaitForFinishedBuffer(5000); 
   const auto image = peak::ipl::Image(peak::BufferTo<peak::ipl::Image>(buffer)); 
   const auto imageProcessed = image.ConvertTo(peak::ipl::PixelFormatName::BGRa8,peak::ipl::ConversionMode::Fast); 
   //Convert 
   //cv::Mat imageMat = imageProcessed???  
   // Queue buffer again 
   dataStream->QueueBuffer(buffer); 
}

IDS peak为QImage提供了一个例子,但对我来说没用。
我试过把image.Data()传递给构造函数,但是ilp::Image和uint 8_t * 一起工作,opencv和uchar* 一起工作。
我知道QImage工作得很好,但我不想包括它只捕捉图像,然后将其转换为垫。
另外,我还搜索了一个方法来将ids buffer直接转换为cv::Mat,但是没有任何结果。

3htmauhk

3htmauhk1#

要指定Mat矩阵的总大小,应该将newImage.total()乘以newImage.elemSize()。如果要将图像转换为peak::ipl::PixelSize Name::BGRa8,则创建的图像(cv::Mat)的大小应该是原始缓冲区的四倍。

cv::Mat newImage(height, width, CV_8UC4);
m_imageConverter->Convert(peak::BufferTo<peak::ipl::Image>(buffer), peak::ipl::PixelFormatName::BGRa8,newImage.data, newImage.total() * newImage.elemSize());
m_dataStream->QueueBuffer(buffer);
cv::imshow("", newImage);
cv::waitKey(1);

此外,可以先创建ipl::Image,然后将数据传递给Mat构造函数:

const auto image = peak::BufferTo<peak::ipl::Image>(buffer).ConvertTo(peak::ipl::PixelFormatName::BGRa8, peak::ipl::ConversionMode::Fast);
cv::Mat newImage(height, width, CV_8UC4, image.Data(),cv::Mat::AUTO_STEP);

相关问题