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)
有时第一次调用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.您始终可以从捕获中"读取"图像.
根据我的经验,OpenCV在SaveImage给定位深度不同于8位的矩阵时写入黑色图像.事实上,这有点记录:
使用此功能只能保存8位单通道或3通道(带'BGR'通道顺序)图像.如果格式,深度或通道顺序不同,请在保存之前使用
cvCvtScale和cvCvtColor转换它,或使用通用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++)
| 归档时间: |
|
| 查看次数: |
106413 次 |
| 最近记录: |