当前位置: 首页 > 知识库问答 >
问题:

使用OpenCV在Raspberry PI上捕获1920x1080视频

晁璞
2023-03-14

硬件:
1.树莓派2
2.树莓派相机

软件:
1。OpenCV 2.4。11
2。用C语言编程

我有以下简单的代码,可以从摄像机捕获视频并在窗口中显示
帧大小始终为640 x 480,尝试更改帧的宽度和高度(如注释行所示)没有帮助,并且保持为640 x 480。

我正在寻找一种方法,将帧的宽度和高度从我的代码(而不是外壳)更改为1920 x 1080
如果可以通过OpenCV或V4l2驱动程序完成,那就太好了

#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char* argv[]) {

    int rc = 0 ;
    int device = 0 ;

    Mat frame;

    namedWindow( "Video", CV_WINDOW_AUTOSIZE ) ;

    VideoCapture capture( device ) ;
    if( capture.isOpened()) {

        cout << "Frame size : " << capture.get(CV_CAP_PROP_FRAME_WIDTH) << " x " << capture.get(CV_CAP_PROP_FRAME_HEIGHT) << endl ;

        //capture.set( CV_CAP_PROP_FRAME_WIDTH, 1920 ) ;
        //capture.set( CV_CAP_PROP_FRAME_HEIGHT, 1080 ) ;
        //capture.set( CV_CAP_PROP_FOURCC, CV_PROP('H','2','6','4')) ;
        //capture.set( CV_CAP_PROP_FOURCC, CV_PROP('M','J','P','G')) ;
        //capture.set( CV_CAP_PROP_FPS, 10 );

        for( ; ; ) {

            if( capture.read( frame )) {

                imshow( "Video", frame );

                if( waitKey( 1 ) == 27 ) {
                    cout << "Esc key pressed by the user" << endl ;
                    break ;
                }
            }
            else {
                rc = -1 ;
                cout << "Cannot read frame from video stream" << endl ;
                break ;
            }
        }
    }
    else {
        rc = -1 ;
        cout << "Cannot open the video device " << device << endl ;
    }

    return( rc ) ;
}

共有1个答案

蓬兴国
2023-03-14

看看Raspicam项目。它可以帮助调整相机在RPI上的分辨率,并与OpenCV很好地集成。https://github.com/cedricve/raspicam

编辑:附加我的测试代码在这里。它在RPIB2上对我很好。曝光值在1到100000之间。

#include <ctime>
#include <iostream>
#include <raspicam/raspicam_cv.h> 
using namespace std; 

int main ( int argc,char **argv ) {

    time_t timer_begin,timer_end;
    raspicam::RaspiCam_Cv Camera;
    Camera.set(CV_CAP_PROP_EXPOSURE, 100);
    cv::Mat image;
    int nCount=10;
    //set camera params
    Camera.set( CV_CAP_PROP_FORMAT, CV_8UC1 );
    //Open camera
    cout<<"Opening Camera..."<<endl;
    if (!Camera.open()) {cerr<<"Error opening the camera"<<endl;return -1;}
    //Start capture
    cout<<"Capturing "<<nCount<<" frames ...."<<endl;
    time ( &timer_begin );
    for ( int i=0; i<nCount; i++ ) {
        Camera.grab();
        Camera.retrieve ( image);
        if ( i%5==0 )  cout<<"\r captured "<<i<<" images"<<std::flush;
    }
    cout<<"Stop camera..."<<endl;
    Camera.release();
    //show time statistics
    time ( &timer_end ); /* get current time; same as: timer = time(NULL)  */
    double secondsElapsed = difftime ( timer_end,timer_begin );
    cout<< secondsElapsed<<" seconds for "<< nCount<<"  frames : FPS = "<<  ( float ) ( ( float ) ( nCount ) /secondsElapsed ) <<endl;
    //save image 
    cv::imwrite("raspicam_cv_image_100.jpg",image);
    cout<<"Image saved at raspicam_cv_image_100.jpg"<<endl;
}
 类似资料:
  • 我尝试用全高清分辨率的罗技C920摄像头捕捉视频。它提供30 fps与此分辨率。 它以30 fps的速度与windows摄像头应用程序配合使用,但无论我如何尝试,我都无法通过opencv videoCapture获得这种fps速度。 注意:我使用windows 10和vs15。我尝试了不同的usb端口,opencv版本和编解码器。结果是相同的,〜5 fps。 我测量fps忽略前10帧。下面是我的计

  • 在OpenCV上使用class VideoCapture时如何旋转摄像头?(Android上的人脸检测示例)。我正在旋转画布: 但摄像机的图像并没有旋转:人脸检测不起作用。 摄像头从以下位置接收流: 我做了以下更新: 但这是行不通的。当我以portret方向运行程序时(在android设备上)——当我以横向方向运行程序时,程序不会启动——程序工作,但当我旋转设备时,程序工作,但显示屏上的图像不会旋

  • 我一直在尝试用OpenCV(在Raspberry Pi 2上)从我的两台C920罗技相机捕获一个H264流。我得出的结论是,这是不可能的,因为它还没有执行。我在opencv/modules/highgui/cap_libv4l.cpp中看了一下,发现“videocapture-function”总是将pixelformat转换为bgr24。我试着把这个改成h264,但只得到了黑屏。我想这是因为它没

  • 当我使用USB摄像头捕捉实时视频流时,我的C /OpenCV应用程序运行良好。 然而,当我将佳能5Dii与实时视频连接时,它找不到相机。 佳能实用程序可以很好地捕捉视频。 我应该使用VideoCapture帽(1)吗?

  • 我遇到的问题是,我无法更改OpenCV视频捕获的分辨率。不管怎样,分辨率总是640x480。我使用的代码是用C编写的,我使用的是opencv 3.4.8。我已经创建了一个超级简单的程序来做这件事,不管我怎么尝试,它似乎都不起作用。 以下是完整的代码: 当我运行上述代码时,帧总是640x480。 我已尝试使用

  • 我正在使用Python 2.7和OpenCV 2.4。9 我需要捕获显示给用户的当前帧,并将其加载为Python中的cv::Mat对象。 你们知道一种快速递归的方法吗? 我需要像下面的例子中所做的那样,从网络摄像头递归地捕获Mat帧: 在本例中,它使用了VideoCapture类来处理从网络摄像头捕获的图像。 用视频捕捉。read()新帧总是被读取并存储到Mat对象中。 我可以将“打印屏幕流”加载