本文整理汇总了C++中mrpt::utils::CImage::loadFromMemoryBuffer方法的典型用法代码示例。如果您正苦于以下问题:C++ CImage::loadFromMemoryBuffer方法的具体用法?C++ CImage::loadFromMemoryBuffer怎么用?C++ CImage::loadFromMemoryBuffer使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类mrpt::utils::CImage
的用法示例。
在下文中一共展示了CImage::loadFromMemoryBuffer方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: retrieveFrame
/* --------------------------------------------------------
retrieveFrame
-------------------------------------------------------- */
bool CFFMPEG_InputStream::retrieveFrame( mrpt::utils::CImage &out_img )
{
#if MRPT_HAS_FFMPEG
if (!this->isOpen()) return false;
TFFMPEGContext *ctx = MY_FFMPEG_STATE;
AVPacket packet;
int frameFinished;
while(av_read_frame(ctx->pFormatCtx, &packet)>=0)
{
// Is this a packet from the video stream?
if(packet.stream_index==ctx->videoStream)
{
// Decode video frame
#if LIBAVCODEC_VERSION_MAJOR>52 || (LIBAVCODEC_VERSION_MAJOR==52 && LIBAVCODEC_VERSION_MINOR>=72)
avcodec_decode_video2(
ctx->pCodecCtx,
ctx->pFrame,
&frameFinished,
&packet);
#else
avcodec_decode_video(
ctx->pCodecCtx,
ctx->pFrame,
&frameFinished,
packet.data,
packet.size);
#endif
// Did we get a video frame?
if(frameFinished)
{
// Convert the image from its native format to RGB:
ctx->img_convert_ctx = sws_getCachedContext(
ctx->img_convert_ctx,
ctx->pCodecCtx->width,
ctx->pCodecCtx->height,
ctx->pCodecCtx->pix_fmt,
ctx->pCodecCtx->width,
ctx->pCodecCtx->height,
m_grab_as_grayscale ? PIX_FMT_GRAY8 : PIX_FMT_BGR24, // BGR vs. RGB for OpenCV
SWS_BICUBIC,
NULL, NULL, NULL);
sws_scale(
ctx->img_convert_ctx,
ctx->pFrame->data,
ctx->pFrame->linesize,0,
ctx->pCodecCtx->height,
ctx->pFrameRGB->data,
ctx->pFrameRGB->linesize);
/* JL: Old code (deprecated)
img_convert(
(AVPicture *)ctx->pFrameRGB,
m_grab_as_grayscale ? PIX_FMT_GRAY8 : PIX_FMT_BGR24, // BGR vs. RGB for OpenCV
(AVPicture*)ctx->pFrame,
ctx->pCodecCtx->pix_fmt,
ctx->pCodecCtx->width,
ctx->pCodecCtx->height
); */
//std::cout << "[retrieveFrame] Generating image: " << ctx->pCodecCtx->width << "x" << ctx->pCodecCtx->height << std::endl;
//std::cout << " linsize: " << ctx->pFrameRGB->linesize[0] << std::endl;
if( ctx->pFrameRGB->linesize[0]!= ((m_grab_as_grayscale ? 1:3)*ctx->pCodecCtx->width) )
THROW_EXCEPTION("FIXME: linesize!=width case not handled yet.")
out_img.loadFromMemoryBuffer(
ctx->pCodecCtx->width,
ctx->pCodecCtx->height,
!m_grab_as_grayscale, // Color
ctx->pFrameRGB->data[0]
);
// Free the packet that was allocated by av_read_frame
av_free_packet(&packet);
return true;
}
}
// Free the packet that was allocated by av_read_frame
av_free_packet(&packet);
}
return false; // Error reading/ EOF
#else
return false;
#endif
}