【发布时间】:2014-09-30 08:47:12
【问题描述】:
我从库中的函数中获取缓冲区。它应该是一个图像缓冲区。我使用 OpenCV 的函数 cv::imdecode(...) 将其转换为 cv::Mat。有时图像在我得到缓冲区之前就被删除了,所以在那种情况下,我预计缓冲区是空的,但我只是发现它包含一个.xml,其中包含某种找不到图像的消息。那么:有没有办法验证缓冲区是否包含.xml 而不是.jpg?或者如何验证?
编辑:
根据我想搜索缓冲区是否以 "<?xml" 开头的评论。
imgOut = cv::imdecode(imgBuf, CV_LOAD_IMAGE_COLOR);
if (imgOut.empty())
{
std::string xmlStart = "<?xml";
std::string bufStart(imgBuf.begin(), imgBuf.begin() + 5);
if (bufStart == xmlStart)
{
throw ImageNotAvailableException()
}
throw ImageDecodeException(bucketNameIn, objectNameIn);
}
如果解码失败,cv::imdecode 将返回一个空的cv::Mat。这样做可以吗(imgBuf 是std::vector< uchar >)?
【问题讨论】:
-
如果它是格式良好的 xml,那么它应该符合规范:w3.org/TR/xml/#sec-well-formed 也相关:stackoverflow.com/questions/891223/better-way-to-detect-xml 因此您可以尝试将其解析为 xml,如果失败则尝试查看对于 jpg 标题:en.wikipedia.org/wiki/JPEG#Syntax_and_structure
-
@EdChum 我已经编辑了问题,你能帮忙吗?
-
除非您仍在寻找包含 inside xml 的图像,否则何必费心呢?如果imdecode不能解析,不管是xml、pdf还是任意垃圾。
-
您似乎想区分丢失的图像和损坏的图像;这是目标吗?
-
@DavidK 不是。如果图像被删除,我想做更多的事情。因为
.xml的情况(deleted image的情况)并不常见,所以我把throw ImageNotAvailableException();放在imgOut.empty()的情况下。