Opencv 摄像头在捕获一帧图片时,保存的是黑屏,不知道问题,谁能帮忙改正一下啊,在线等!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Opencv 摄像头在捕获一帧图片时,保存的是黑屏,不知道问题,谁能帮忙改正一下啊,在线等!!!相关的知识,希望对你有一定的参考价值。

#include "cxcore.h"
#include "cvcam.h"
#include "windows.h"
#include "highgui.h"
int main()

IplImage* image=NULL;
int camsnums=cvcamGetCamerasCount();//返回可以访问的摄像头数目
HWND MyWin;// 设置系统属性
cvcamSetProperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE); //选择第一个摄像头,数字代表第几个摄像头
MyWin=(HWND)cvGetWindowHandle("CameraUSB window"); // 创建一个窗口Mywin,MyWin是窗口HWND的类型
cvcamInit();//初始化摄像头
cvcamStart();// 摄像头开始摄像
cvWaitKey();//等待窗口出现
CvCapture* capture = cvCaptureFromCAM(0);
image=cvQueryFrame(capture);
cvSaveImage("D:\\saveImage.jpg",image);
cvcamStop();//停止摄像头
cvcamExit();//退出
return 0;

参考技术A cvWaitKey(); 是延时等待消息,不填参数默认0,当写0的时候消息处于等待状态,
我现在手里没摄像头,没发测试你的程序,不过要我写,我会把这句话放到cvSaveImage()后面
给你一段我以前写的保存图像的代码吧 VS里做的
USES_CONVERSION; //格式转换标志
CvCapture * pCapture = 0; // 用于在视频中捕获图像
IplImage* pFrame = NULL; // 用于存储
int nNum = 0;//帧数
if (!pCapture)
pCapture=cvCreateCameraCapture(-1);
if (!pCapture)

AfxMessageBox(_T("无法打开摄像头"));
return;

// 获取视频
pCapture = cvCaptureFromCAM(0);
while(pFrame = cvQueryFrame( pCapture ))

nNum++;//帧数++
cvShowImage("view",pFrame);
CString str;
str.Format(_T("第%d帧.jpg"),nNum);
cvSaveImage(T2A(str),pFrame);
char cExit = cvWaitKey(2); // 每帧显示2毫秒
if (cExit == 27) // Esc退出
break;

......
// 释放略追问

求完整的代码,第一次写这个,临时看的,明天就要交啦

追答

都写成这样了 还不完整啊?

参考技术B // 录制视频.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#pragma comment(lib,"highgui210.lib")
#pragma comment(lib,"cv210.lib")
#pragma comment(lib,"cvaux210.lib")
#pragma comment(lib,"cxcore210.lib")
#include "cv.h"
#include "highgui.h"
#include "cvaux.h"
#include "cxcore.h"
#include "string.h"

using namespace std;

#include <iostream>
int main()

CvCapture* capture=cvCaptureFromCAM(-1);
CvVideoWriter* video=NULL;
IplImage* frame=NULL;
int FrameW=320;
int FrameH=240;
IplImage *FrameCopy=cvCreateImage(cvSize(FrameW,FrameH),8,3);
int capturenum=0;
int n;
if(!capture) //如果不能打开摄像头给出警告

cout<<"Can not open the camera."<<endl;
return -1;

else

frame=cvQueryFrame(capture); //首先取得摄像头中的一帧

video=cvCreateVideoWriter("P15.avi",-1,32,
cvSize(FrameW,FrameH)); //创建CvVideoWriter对象并分配空间
//保存的文件名为camera.avi,编码要在运行程序时选择,大小就是摄像头视频的大小,帧频率是32
if(video) //如果能创建CvVideoWriter对象则表明成功

cout<<"VideoWriter has created."<<endl;

cvNamedWindow("Camera Video",1); //新建一个窗口
while(capturenum<=2000)

frame=cvQueryFrame(capture); //从CvCapture中获得一帧
cvResize(frame,FrameCopy,1);
capturenum++;
if(!frame)

cout<<"Can not get frame from the capture."<<endl;
break;

n=cvWriteFrame(video,FrameCopy); //判断是否写入成功,如果返回的是1,表示写入成功
cout<<n<<endl;
cvShowImage("Camera Video",frame); //显示视频内容的图片
if(cvWaitKey(2)>0) break; //有其他键盘响应,则退出

cvReleaseVideoWriter(&video);
cvReleaseCapture(&capture);
cvReleaseImage(&FrameCopy);
cvDestroyWindow("Camera Video");

return 0;
本回答被提问者采纳

使用 OpenCV 捕获和保存视频

【中文标题】使用 OpenCV 捕获和保存视频【英文标题】:Video capture and save using OpenCV 【发布时间】:2014-01-22 11:51:35 【问题描述】:

下面是我用于从网络摄像头获取视频并将其保存在硬盘上的代码。在运行程序时,它会显示“视频编写器未打开”。我哪里错了?

#include <opencv\cv.h>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#include <iostream>

#pragma comment(lib, "Ws2_32.lib")
#define default_buflen 1024

using namespace std;
using namespace cv;

#define default_port "1234"

int main(int argc, char** argv)

    Mat capture;
    VideoCapture cap(0);
    if(!cap.isOpened())
    
        cout<<"Cannot connect to camera"<<endl;
        getchar();
        return -1;
    
    double fps=30;
    Size s=Size((int)cap.get(CV_CAP_PROP_FRAME_WIDTH),(int)cap.get(CV_CAP_PROP_FRAME_WIDTH));
    VideoWriter vidcapt;
    vidcapt.open("c:\\out.avi",CV_FOURCC('D','I','V','X'),cap.get(CV_CAP_PROP_FPS),s,true);

    if(!vidcapt.isOpened())
    
        cout<<"Video writer not opening"<<endl;
        getchar();
        return -1;
    

    while(true)
    
        cap>>capture;
        namedWindow("Display",1);
        imshow("Display",capture);

        vidcapt<<capture;

        int ch=waitKey(5);
        if(char(ch)==27)
        
            break;
        
    

我已经阅读了here 和here 给出的答案,但我不明白我哪里出错了。

【问题讨论】:

【参考方案1】:

尝试其他编解码器

CV_FOURCC('P','I','M','1') = MPEG-1 编解码器

CV_FOURCC('M','J','P','G') = motion-jpeg 编解码器(效果不佳)

CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 编解码器

CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 编解码器

CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 编解码器

CV_FOURCC('U', '2', '6', '3') = H263 编解码器

CV_FOURCC('I', '2', '6', '3') = H263I 编解码器

CV_FOURCC('F', 'L', 'V', '1') = FLV1 编解码器

从here 复制粘贴。我设法用 CV_FOURCC('F', 'L', 'V', '1') 编写视频。

顺便说一句,编解码器当然应该安装在你的机器上。

【讨论】:

都试过了。还是行不通。接下来做什么?另外,如何知道安装了哪些编解码器? @PrakharMohanSrivastava 检查您的编解码器,重新安装它们,如果您使用调试选项编译它,则调试 opencv【参考方案2】:

根据您的代码,我无法理解为什么您每次都在 while 循环中创建窗口 Display,而且您每次都初始化 VideoWriter 对象可能是错误的。我对您的代码稍作修改,请尝试,它可能对您有所帮助

    #include <opencv\cv.h>
    #include <opencv2\highgui\highgui.hpp>
    #include <opencv2\imgproc\imgproc.hpp>
    #include <WinSock2.h>
    #include <WS2tcpip.h>
    #include <stdio.h>
    #include <iostream>

    #pragma comment(lib, "Ws2_32.lib")
    #define default_buflen 1024

    using namespace std;
    using namespace cv;

    #define default_port "1234"

    int main(int argc, char** argv)
    
        Mat capture;
        VideoCapture cap(0);
        if(!cap.isOpened())
        
            cout<<"Cannot connect to camera"<<endl;
            getchar();
            return -1;
        

  namedWindow("Display",CV_WINDOW_AUTOSIZE); 

  double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH); 
  double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT); 

  Size frameSize(static_cast<int>(dWidth), static_cast<int>(dHeight));

  VideoWriter oVideoWriter ("c:\\out.avi", CV_FOURCC('P','I','M','1'), 20, frameSize,true);

   if ( !oVideoWriter.isOpened() ) 
   
      cout << "ERROR: Failed to write the video" << endl;
      return -1;
    

    while(true)
    
          Mat frame;

          bool bSuccess = cap.read(frame); // read a new frame from video

          if (!bSuccess) //if not success, break loop
          
             cout << "ERROR: Cannot read a frame from video file" << endl;
             break;
          

          oVideoWriter.write(frame); //writer the frame into the file

         imshow("Display", frame); 

         if (waitKey(10) == 27) 
         
            cout << "esc key is pressed by user" << endl;
            break; 
         
      
  

【讨论】:

以上是关于Opencv 摄像头在捕获一帧图片时,保存的是黑屏,不知道问题,谁能帮忙改正一下啊,在线等!!!的主要内容,如果未能解决你的问题,请参考以下文章

使用opencv线程捕获空白图像

opencv18视频操作

OpenCV|图片与视频的相互转换(C++&Python)

如何opencv读取摄像头并保存每一帧图像?

如何opencv读取摄像头并保存每一帧图像

OpenCV打开摄像头画面不完整处理