【发布时间】:2010-12-17 19:30:48
【问题描述】:
这段代码实际上一直工作到现在。我不知道是什么导致它现在抛出错误(我实际上不记得对代码进行任何更改)。在这里(它从文件中读取图像到 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 );
编辑:
更长的sn-p:
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 );
}
【问题讨论】:
-
imencode的文档对其参数有何说明? -
@Martin York opencv.willowgarage.com/documentation/cpp/…
-
为什么要混合 C++ 和 C 接口? (使用 cv::Mat 的 IplImage 与 cv::imencode)
-
@etarion 我认为这是将 IplImage 转换为 jpeg 而不将其保存到磁盘的唯一方法?我只能将它放在内存(缓冲区)中。如果您知道另一种方法,请发布答案。不过,关键是上面的代码曾经可以工作。
-
重点是,当您可以访问更友好的 cv::Mat 时,为什么还要使用 IplImage*?此外,您应该使用调试器逐步完成,以查看实际导致错误的原因...
标签: c++ visual-c++ opencv