您的位置:首页 > 编程语言 > Qt开发

12、新手入手树莓派教程--Qt中使用wiringPi来驱动RGB灯、使用opencv打开摄像头(代码分享)

2017-12-08 09:51 921 查看
环境:

1、树莓派3b

2、Qt

3、opencv

4、wiringPi

功能:

1、驱动USB摄像头并在窗口中显示

2、驱动GPIO口,控制LED灯的闪烁


整体效果图:



代码如下:
起始
#include "cameramanage.h"
#include "ui_cameramanage.h"
#include <QPixmap>
#include <QFileDialog>
#include <QPicture>
#include <iostream>
#include <wiringPi.h>

CameraManage::CameraManage(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::CameraManage)
{
ui->setupUi(this);
timer = new QTimer(this);
timer_led = new QTimer(this);
cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
cap.set(CV_CAP_PROP_FPS, 30);//帧数
cap.set(CV_CAP_PROP_BRIGHTNESS, 1);//亮度 1
cap.set(CV_CAP_PROP_CONTRAST,40);//对比度 40
cap.set(CV_CAP_PROP_SATURATION, 50);//饱和度 50
cap.set(CV_CAP_PROP_HUE, 50);//色调 50
cap.set(CV_CAP_PROP_EXPOSURE, 50);//曝光 50

/*信号和槽*/
connect(timer, SIGNAL(timeout()), this, SLOT(readFarme()));  // 时间到,读取当前摄像头信息
connect(timer_led, SIGNAL(timeout()), this, SLOT(LED_open()));
}

CameraManage::~CameraManage()
{
delete ui;
delete timer;
}

QImage  CameraManage::Mat2QImage(Mat& cvImg)
{
QImage qImg;
if(cvImg.channels()==3)                             //3 channels color image
{

cv::cvtColor(cvImg,cvImg,CV_BGR2RGB);
qImg =QImage((const unsigned char*)(cvImg.data),
cvImg.cols, cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_RGB888);
}
else if(cvImg.channels()==1)                    //grayscale image
{
qImg =QImage((const unsigned char*)(cvImg.data),
cvImg.cols,cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_Indexed8);
}
else
{
qImg =QImage((const unsigned char*)(cvImg.data),
cvImg.cols,cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_RGB888);
}

return qImg;
}

QImage CameraManage::ScaleImage2Label(QImage qImage, QLabel* qLabel)
{
QImage qScaledImage;
QSize qImageSize = qImage.size();
QSize qLabelSize = qLabel->size();
double dWidthRatio = 1.0*qImageSize.width() / qLabelSize.width();
double dHeightRatio = 1.0*qImageSize.height() / qLabelSize.height();
if (dWidthRatio>dHeightRatio)
{
qScaledImage = qImage.scaledToWidth(qLabelSize.width());
}
else
{
qScaledImage = qImage.scaledToHeight(qLabelSize.height());
}
return qScaledImage;
}

void CameraManage::on_open_clicked()
{
cap.open(-1);

if (cap.isOpened())
{
cout << "cap is opened" << endl;
}else
{
cout << "cap is not opened" << endl;
}

timer->start(40);              // 开始计时,超时则发出timeout()信号
}

void CameraManage::readFarme()
{
cap >> frame;

image = Mat2QImage(frame);
//    imshow("", frame);

QImage scaleImage = ScaleImage2Label( image, ui->lable );   // 显示到label上
ui->lable->setPixmap(QPixmap::fromImage(scaleImage));
ui->lable->setAlignment(Qt::AlignCenter);
ui->lable->show();
}

void CameraManage::GPIO_init()
{
wiringPiSetup();
pinMode(0, OUTPUT);
timer_led->start(500);
}

void CameraManage::LED_open()
{
if(led_turn == 0)
{
digitalWrite(0, HIGH);
led_turn++;
}else{
digitalWrite(0, LOW);
led_turn--;
}

}
截止


工程链接:树莓派驱动USB摄像头个驱动GPIO口的代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: