[OpenCV] -- 简单摄像头操作

Email : hahayacoder@gmail.com

 

1 简单玩了下OpenCV中开启和关闭电脑摄像头,其实挺简单的,接下来在Qt中实现

 

2 打开Qt Creator,新建一个Qt Gui工程

 

3 打开ui文件,设计成下图(注意:图像显示是一个QLabel,用于显示摄像头拍到的照片,将其拖大点,不然太小拍到的照片显示部分过小)

 

4 实现过程中用到两个重要的函cvCreateCameraCapture(开启摄像头)和cvReleaseCapture(关闭摄像头)

 

5 大致思路是:点击打开摄像头按钮,则开启摄像头,并设置一个定时器,每隔一段时间捕获摄像头摄取到的帧,将其转换成QImage,最最后在QLabel控件上显示

 

6 代码如下

// opencamera.h
#ifndef OPENCAMERA_H
#define OPENCAMERA_H

#include <QDialog>
#include <QTimer>
#include <QImage>

#include "cv.h"
#include "highgui.h"


namespace Ui {
class OpenCamera;
}

class OpenCamera : public QDialog
{
    Q_OBJECT
    
public:
    explicit OpenCamera(QWidget *parent = 0);
    ~OpenCamera();

private slots:
    void sltBtnOpenCamera();        //打开摄像头
    void sltBtnCloseCamera();       //关闭摄像头
    void sltTimeOut();                  //定时器时间到达 读取摄像头详细


private:
    Ui::OpenCamera *ui;

    //定时器对象 没隔一段时间读取摄像头详细
    QTimer *m_timer;
    CvCapture *m_camera;        //视频获取结构 作为视频获取函数的返回值
    IplImage *m_imgFrame;       //IplImage结构指针 存放每一帧的图像
};

#endif // OPENCAMERA_H


 

// opencamera.cpp
#include "opencamera.h"
#include "ui_opencamera.h"

OpenCamera::OpenCamera(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::OpenCamera)
{
    ui->setupUi(this);

    //初始化成员变量
    m_timer = new QTimer(this);
    m_camera = NULL;
    m_imgFrame = NULL;


    //连接信号和槽
    connect(ui->m_btnOpenCamera, SIGNAL(clicked()), this, SLOT(sltBtnOpenCamera()));
    connect(ui->m_btnCloseCamera, SIGNAL(clicked()), this, SLOT(sltBtnCloseCamera()));
    connect(m_timer, SIGNAL(timeout()), this, SLOT(sltTimeOut()));
}

OpenCamera::~OpenCamera()
{
    delete ui;
}

void OpenCamera::sltBtnOpenCamera()
{
    //打开摄像头 从摄像头中获取视频
    m_camera = cvCreateCameraCapture(0);
    //开启定时器 没隔0.5秒刷新一次
    m_timer->start(500);
}

void OpenCamera::sltTimeOut()
{
    //读取摄像头信息 将读取回来的帧转换成QImage类型 并在主界面的QLabel中显示

    //从摄像头中抓取并返回每一帧
   m_imgFrame = cvQueryFrame(m_camera);
   //将抓取到的帧转换成QImage格式
   QImage showImage((const uchar*)m_imgFrame->imageData, m_imgFrame->width, m_imgFrame->height, QImage::Format_RGB888);
   //将图片显示到QLabel上
   ui->m_lbPhoto->setPixmap(QPixmap::fromImage(showImage));
}
void OpenCamera::sltBtnCloseCamera()
{
    //释放摄像头内存
    cvReleaseCapture(&m_camera);
    //停止定时器
    m_timer->stop();

}



//main.cpp
#include "opencamera.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    OpenCamera w;
    w.show();
    
    return a.exec();
}


运行截图:

### 使用 OpenCV-Python 控制和操作摄像头 #### 安装依赖库 为了能够顺利使用 OpenCV 来控制摄像头,需要确保已经正确安装 Python 和 `opencv-python` 库。可以通过如下命令来完成安装: ```bash pip install opencv-python ``` 对于遇到无法检测到摄像头的情况,在某些特定环境下可能是由于权限设置不当所引起的[^2]。 #### 检查并修复常见错误 当尝试打开摄像头却收到类似于 `cv2.error: OpenCV(4.xx.x)` 的异常提示时,这通常意味着程序未能成功初始化视频捕获设备。一种可能的解决方案是从环境中移除当前版本的 OpenCV 并重新安装最新稳定版: ```bash pip uninstall opencv-python pip install opencv-python-headless ``` 上述方法有助于排除因旧版本兼容性问题而导致的功能失效[^3]。 #### 编写代码实现基本功能 下面给出一段简单的 Python 脚本用于开启默认内置摄像头,并显示实时画面流直到按下键盘上的任意键为止: ```python import cv2 def main(): cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if not ret or frame is None: print("Failed to grab frame") break cv2.imshow('Video Stream', frame) key = cv2.waitKey(1) if key != -1: break cap.release() cv2.destroyAllWindows() if __name__ == "__main__": main() ``` 这段脚本会创建一个窗口展示来自索引为 0 (即第一个可用)摄像装置的画面帧序列;如果想要连接外部 USB 摄像头,则可以更改参数值为其他整数比如 1 或者更高取决于实际硬件配置情况[^5]。 #### 处理多台摄像机的情形 如果有多个外接摄录器材接入计算机系统内,那么可以根据各自对应的编号分别实例化不同的 VideoCapture 对象来进行独立操控: ```python capture_builtin = cv2.VideoCapture(0) # 内置摄像头 capture_usb = cv2.VideoCapture(2) # 假设USB接口位于第二个位置上 ``` 以上就是利用 OpenCV-Python 进行基础级别的摄像头管理与交互的方式介绍。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值