这段代码实际上以前一直有效。我现在不知道是什么导致它抛出错误(我实际上不记得对代码进行过任何更改)。如下(它从文件读取图像到 OpenCV IplImage 对象,然后将其转换为 jpeg 缓冲区):
IplImage* fIplImageHeader = cvLoadImage( filePath.c_str() );
vector<int> p;
p.push_back( CV_IMWRITE_JPEG_QUALITY );
p.push_back( 75 ); // JPG quality
vector<unsigned char> buf;
cv::imencode( ".jpg", fIplImageHeader, buf, p ); // this line gives error
完整的错误是:
Unhandled exception at 0x638fee22 in Client.exe: 0xC0000005: Access violation reading location 0x02176000.
fIplImageHeader 包含一个有效的图像,我可以使用以下方法确认:
cvShowImage( "Window", fIplImageHeader );
EDIT:
更长的片段:
while ( l < 30 )
{
// path to image
std::stringstream sstm;
string filePath;
sstm << workingDirectory << "/temp/" << k << ".jpg";
filePath = sstm.str();
cout << filePath.c_str() << endl;
// load image to IplImage
IplImage* fIplImageHeader = cvLoadImage( filePath.c_str() );
// convert to JPG
vector<int> p;
p.push_back( CV_IMWRITE_JPEG_QUALITY );
p.push_back( 75 ); // JPG quality
vector<unsigned char> buf;
cv::imencode( ".jpg", fIplImageHeader, buf, p );
// do stuff
k++;
l++;
if (10 == k)
{
k = 0;
}
char key = cvWaitKey( 1000/30 );
cvReleaseImage( &fIplImageHeader );
}
输出缓冲区应该调整为输出图像的大小,但您尚未使用buf
目的。至少您引用的文档页面提到了这一点http://opencv.willowgarage.com/documentation/cpp/reading_and_writing_images_and_video.html http://opencv.willowgarage.com/documentation/cpp/reading_and_writing_images_and_video.html
您可以尝试设置明确的尺寸吗buf
?现在在您的代码示例中,它只是一个空向量。
编辑:是的,我认为你是对的,如果我在文档页面上再看一些,这似乎表明cv::imencode
将进行分配,因此您不必这样做。如果这是真的,那么您的输入图像是否真的很大,是否内存不足?您还可以进入调试版本吗cv::imencode
?
编辑:此页面还有另一个代码示例http://opencv.willowgarage.com/documentation/cpp/core_basic_structurals.html#Mat http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html#Mat
IplImage* img = cvLoadImage("greatwave.jpg", 1);
Mat mtx(img); // convert IplImage* -> cv::Mat
您还可以尝试“转换为 cv::Mat”步骤,并将其传递到cv::imencode
?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)