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

3 篇文章 0 订阅

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中,进行魔方六面的颜色识别需要结合图像处理和机器学习技术,尤其是模板匹配或者深度学习模型。下面是一个简单的步骤概述: 1. **安装库**: 首先确保已经安装了OpenCV(cv2)和numpy。如果尚未安装,可以使用pip命令: ``` pip install opencv-python numpy ``` 2. **获取视频流**: 使用`VideoCapture`函数从摄像头读取实时视频: ```python import cv2 cap = cv2.VideoCapture(0) # 使用默认摄像头,0号设备 ``` 3. **预处理图像**: 对每一帧进行灰度化、平滑处理以及可能的二值化操作,以便于颜色识别: ```python while True: ret, frame = cap.read() gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 可能还需要滤波和阈值设置 ``` 4. **识别颜色**: - **传统方法**:对于简单的颜色识别,你可以创建模板图片并使用`matchTemplate()`或`findContours()`配合颜色查找。 - **机器学习方法**:如果是复杂场景,可以考虑使用如Haar级联分类器(用于人脸检测)、HOG+SVM或深度学习(如TensorFlow或PyTorch)训练模型来识别每个面。 5. **绘制结果**: 根据识别出的颜色,在原始图像上标记出来,显示识别后的魔方面。 ```python for side in ['front', 'back', 'left', 'right', 'top', 'bottom']: template_color = ... # 每一面的颜色模板 result = cv2.matchTemplate(gray_frame, template_color, cv2.TM_CCOEFF_NORMED) min_val, max_val, _, max_loc = cv2.minMaxLoc(result) top_left = max_loc bottom_right = (top_left[0] + w, top_left[1] + h) cv2.rectangle(frame, top_left, bottom_right, (0, 255, 0), 2) 6. **循环和关闭资源**: 循环处理每帧直到按下停止键,最后记得释放摄像头资源: ```python while cap.isOpened(): ... if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值