在OpenCV中保存图像

Suj*_*osh 26 c++ opencv computer-vision

我是OpenCV的新手,尝试捕获图像,然后将其保存到文件中.我发布的代码供您参考,如下.

正在保存jpg文件,但它是黑色的.

// Capture the Image from the webcam
CvCapture *pCapturedImage = cvCreateCameraCapture(0);

// Get the frame
IplImage *pSaveImg = cvQueryFrame(pCapturedImage);

// Save the frame into a file
cvSaveImage("test.jpg". ,pSaveImg); // A JPG FILE IS BEING SAVED
                                    // OF 6KB , BUT IT IS BLACK
Run Code Online (Sandbox Code Playgroud)

所有功能都是成功的.我在XP和Vista中都尝试了上面的代码 - 结果是两者都是黑色图像.请让我知道我错过了什么.

X''*_*X'' 21

如果使用C++,最好使用C++接口:

using namespace cv;
// Capture the Image from the webcam
VideoCapture cap(0);

// Get the frame
Mat save_img; cap >> save_img;

if(save_img.empty())
{
  std::cerr << "Something is wrong with the webcam, could not get frame." << std::endl;
}
// Save the frame into a file
imwrite("test.jpg", save_img); // A JPG FILE IS BEING SAVED
Run Code Online (Sandbox Code Playgroud)


nim*_*cap 5

有时第一次调用cvQueryFrame()会返回一个空图像.尝试:

IplImage *pSaveImg = cvQueryFrame(pCapturedImage);
pSaveImg = cvQueryFrame(pCapturedImage);
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,请尝试自动选择捕获设备:

CvCapture *pCapturedImage = cvCreateCameraCapture(-1);
Run Code Online (Sandbox Code Playgroud)

或者您可以尝试选择n = 1,2,3的其他捕获设备...

CvCapture *pCapturedImage = cvCreateCameraCapture(n);
Run Code Online (Sandbox Code Playgroud)

PS:另外我相信对你的变量名称的捕获图像存在误解.变量pCapturedImage不是Image,它是Capture.您始终可以从捕获中"读取"图像.


sas*_*nin 5

根据我的经验,OpenCV在SaveImage给定位深度不同于8位的矩阵时写入黑色图像.事实上,这有点记录:

使用此功能只能保存8位单通道或3通道(带'BGR'通道顺序)图像.如果格式,深度或通道顺序不同,请在保存之前使用cvCvtScalecvCvtColor转换它,或使用通用cvSave将图像保存为XML或YAML格式.

在您的情况下,您可能首先要调查捕获的图像类型,更改捕获属性(我认为CV_CAP_PROP_CONVERT_RGB可能很重要)或之后手动转换它.

这是一个如何使用OpenCV转换为8位表示的示例.cc这是一个类型的原始矩阵CV_32FC1,cc8u是它的缩放版本,实际上是由SaveImage:

# I want to save cc here
cc8u = CreateMat(cc.rows, cc.cols, CV_8U)
ccmin,ccmax,minij,maxij = MinMaxLoc(cc)
ccscale, ccshift = 255.0/(ccmax-ccmin), -ccmin
CvtScale(cc, cc8u, ccscale, ccshift)
SaveImage("cc.png", cc8u)
Run Code Online (Sandbox Code Playgroud)

(对不起,这是Python代码,但应该很容易将其翻译为C/C++)