我想以.pgm格式保存实时视频的每一帧。我正在使用c ++中的opencv 2.4.8。我的问题是,尽管所有的帧都以正确的格式保存并以现实的方式保存(例如as frame_1.pgm),当我打开它们时,它们不是灰度级的,因为.pgm照片应该是。此外,我用hexeditor打开图像并将它们与正确的pgm照片进行比较,并且存在明显的差异!有人可以对我做错了什么提出建议吗?
这是我的代码的关键部分:
/////////////////////////////////////////////// ///////////////
vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PXM_BINARY);
compression_params.push_back(0);
captureDevice1>> captureFrame1;
imwrite("frame_55.pgm",captureFrame1,compression_params);
//string imagename=argv[2];
string imagename="frame_";
//string imagename="frame_";
char numberfile[17];
sprintf_s(numberfile,17,"%u",im);
imagename+=numberfile;
imagename+=".pgm";
std::ifstream in( imagename.c_str(), std::ios::binary );
if ( !in )
{
std::cout << "Error in Image: " << imagename << std::endl;
continue;
}
in.close();
/////////////////////////////////////////////// ////////////////////////
现在,如果我尝试加载图片:frame_55.pgm我得到一个“不支持的格式”错误,而它与其他.pgm图像一起正常工作!!
Thnx提前为你们提供帮助!!!
答案 0 :(得分:0)
这是更正后的代码:
//Device1
VideoCapture captureDevice1;
captureDevice1.open(0);
//setup files used in capture process
//Device1
Mat captureFrame1;
Mat grayscaleFrame1;
for(int im=0; im<=numimages; im++){
// Load the source image into our simple image class.
captureDevice1>> captureFrame1;
if(captureFrame1.empty())
{
cout<<"empty frame skipped"<<endl;
continue;
}
// name each frame as frame_numOframe
stringstream strs;
strs << im;
string temp_str = strs.str();
temp_str="frame_"+temp_str+".pgm";//assign coords into one string
//parameters for saving as .pgm
vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PXM_BINARY);
compression_params.push_back(0);
cvtColor(captureFrame1,grayscaleFrame1, CV_BGR2GRAY);//convert to grayscale
imwrite(temp_str,grayscaleFrame1);//save image