0


opencv的基础用法及其在QT中的应用

文章目录

创作不易,先赞后看

在这里插入图片描述

一.基础用法

1.图片色彩空间转换

intfun1(){//Mat opencv中表示图片的类型
    Mat src;//imread 加载图片
    src =imread("D:/opencv/1.jpg");if(src.empty()){
        cout<<"could not load image...\n"<<endl;return-1;}//转换图片色彩空间1、BGR->RGB//参数1:原图    参数2:目标图    参数3:空间参数
    Mat dst;cvtColor(src , dst ,CV_BGR2RGB);//2、灰度
    Mat gray;cvtColor(src , gray , CV_BGR2GRAY);imshow("src", src);imshow("dst", dst);imshow("gray", gray);//创建窗口           标题名字//namedWindow("input image", CV_WINDOW_AUTOSIZE);//显示图片(1.自动创建窗口  2.显示图片)//imshow("input image", src);//等待键盘输入  参数0:永久等待waitKey(0);}

2.保存图片

intfun2(){
    Mat src;
    src =imread("D:/opencv/1.jpg");if(src.empty()){
        cout<<"could not load image...\n"<<endl;return-1;}//转换为灰度图
    Mat gray;cvtColor(src,gray,CV_BGR2GRAY);//保存图片imwrite("D:/opencv/gray.jpg",gray);}

3.图片浏览器

intfun3(){
    vector<string> paths;for(int i=1;i<=32;i++){char buf[50];sprintf(buf,"D:/QT/heads/head%d.jpg",i);
        cout<<buf<<endl;
        paths.push_back(buf);}
    Mat src =imread(paths[0]);imshow("src",src);int i =0;while(true){int key =waitKey(0);if(key =='a'){
            cout<<"pre"<<endl;
            i = i==0?31:i-1;imshow("src",imread(paths[i]));}elseif(key =='d'){
            cout<<"next"<<endl;
            i = i==31?0:i+1;imshow("src",imread(paths[i]));}if(key =='b'){break;}}}

4.播放视频文件

intfun4(){//1.视频对象
    VideoCapture vc;//2. 打开视频文件    打开摄像头,参数0//if(vc.open("D:/QT/img/mv2.mp4"))if(vc.open(0)){while(true){
            Mat src;//3.提取一帧图像 >>自动往后取下一帧图像
            vc>>src;//4.如果提取成功,播放图像if(!src.empty()){
                Mat gray;cvtColor(src , gray , CV_BGR2GRAY);//反转图像 0:x轴 1:y轴 -1:xy轴flip(gray,gray,1);int x = gray.cols/2;int y = gray.rows/2;//矩形
                Rect r(Point(x-100,y-100),Size(200,200));//画框 原图 矩形 颜色BGRrectangle(gray,r,Scalar(255,255,255),3);imshow("gray",gray);//0:永久等待 其他:单位毫秒waitKey(20);}else{break;}}}else{
        cout<<"open fail"<<endl;}}

5.调整图片大小

intfun5(){
    Mat src;
    src =imread("D:/QT/img/tim.jpg");if(src.empty()){
        cout<<"could not load image...\n"<<endl;return-1;}//获取图片的宽、高
    cout<<"w: "<<src.cols<<" h:"<<src.rows<<endl;//调整图片大小为250 330
    Mat dst;
    cv::resize(src,dst,Size(250,300));imshow("src",src);imshow("dst",dst);waitKey(0);}

6.截图 抠图 矩形(Point(x,y) Size(w,h))

intfun6(){
    Mat src;
    src =imread("D:/QT/img/tim.jpg");if(src.empty()){
        cout<<"could not load image...\n"<<endl;return-1;}
    cout<<"w: "<<src.cols<<" h:"<<src.rows<<endl;//矩形
    Rect r(Point(0,0),Size(320,410));//截图 Mat对象对()重载了   小图 = 大图(r)
    Mat dst =src(r);imshow("src",src);imshow("dst",dst);waitKey(0);}

7.图片中画矩形框

intfun7(){
    Mat src;
    src =imread("D:/QT/img/Chris.jpg");if(src.empty()){
        cout<<"could not load image...\n"<<endl;return-1;}
    cout<<"w: "<<src.cols<<" h:"<<src.rows<<endl;int x = src.cols/2;int y = src.rows/2;//矩形
    Rect r(Point(x-100,y-100),Size(200,200));//截图 Mat对象对()重载了   小图 = 大图(r)//画框 原图 矩形 框的颜色BGR 线宽rectangle(src,r,Scalar(255,0,0),3);imshow("src",src);waitKey(0);}

二、opencv在QT中的用法

1.QT中导入opencv

INCLUDEPATH += D:/opencv/opencv3.4-install/install/include
INCLUDEPATH += D:/opencv/opencv3.4-install/install/include/opencv
INCLUDEPATH += D:/opencv/opencv3.4-install/install/include/opencv2
LIBS += D:/opencv/opencv3.4-install/install/x86/mingw/lib/libopencv_*.a

#include<opencv2/opencv.hpp>usingnamespace cv;

2.cv图片转qt图片

QPixmap convertCv2Qt(Mat src);
QPixmap MainWindow::convertCv2Qt(Mat src){//转换色彩空间cvtColor(src,src,CV_BGR2RGB);//Mat --> QImage     rgb图像的数据,宽,高,一行的通道数,QImage的格式
    QImage img(src.data,src.cols,src.rows,src.cols*src.channels(),QImage::Format_RGB888);//QImage --> QT:QPixmap
    QPixmap pic =QPixmap::fromImage(img);return pic;}

3.图片与控件的大小适应

Mat src =imread("D:/QT/img/1.jpg");
cv::resize(src,src,Size(ui->label->width(),ui->label->height()));//图片大小适应控件大小

QPixmap p =QPixmap::fromImage(img);
ui->label->resize(QSize(p.size()));//控件大小适应图片大小

4.定时器事件

#include<QTimerEvent>voidtimerEvent(QTimerEvent *ev);//周期性执行voidMainWindow::timerEvent(QTimerEvent *ev){if(ev->timerId()== timeId1){
        ui->label->setNum(++count);}elseif(ev->timerId()== timeId2){
        ui->label_2->setNum(++count2);}}voidMainWindow::on_pushButton_start_clicked(){
    timeId1 =startTimer(1000);//毫秒为单位,每间隔多长时间执行一次
    timeId2 =startTimer(2000);//又开启一个}voidMainWindow::on_pushButton_stop_clicked(){killTimer(timeId1);}

5.矩形外像素点变暗

voidMainWindow::timerEvent(QTimerEvent *ev){
    Mat src;
    vc>>src;if(!src.empty()){
        cv::resize(src,src,Size(ui->label_vidio->width(),ui->label_vidio->height()));//图片大小适应控件大小
        Rect r(Point(src.cols/2-100,src.rows/2-100),Size(200,200));//画框:  原图 矩形 框的颜色BGR   线宽rectangle(src,r,Scalar(255,255,255),2);//Mat dst = Mat(src.size(),src.type());//Mat构造函数for(int i=0;i<src.cols;i++){for(int j=0;j<src.rows;j++){//if(i>=src.cols/2-100&&i<=src.cols/2+100&&j>=src.rows/2-100&&j<=src.rows/2+100)if(!r.contains(Point(i,j)))//判断点在矩形内{

                    Vec3b v = src.at<Vec3b>(Point(i,j));for(int m=0;m<3;m++){
                        v[m]=saturate_cast<uchar>(v[m]-50);//限制}
                    src.at<Vec3b>(Point(i,j))= v;}}}

        ui->label_vidio->setPixmap(convertCv2Qt(src));}else{killTimer(timerId1);
        ui->label_vidio->setText("播放完毕");}}

6.Qt滑动条控制像素点

voidMainWindow::on_horizontalSlider_sliderMoved(int position){if(src.empty()){qDebug()<<"could not load image...\n";return;}
    Mat dst =Mat(src.size(),src.type());for(int i=0;i<src.cols;i++){for(int j=0;j<src.rows;j++){
            Vec3b v = src.at<Vec3b>(Point(i,j));for(int m=0;m<3;m++){
                v[m]=saturate_cast<uchar>(v[m]+position);//限制}
            dst.at<Vec3b>(Point(i,j))= v;}}
    ui->label->setPixmap(convertCv2Qt(dst));}

7.sqlite数据库

pro文件:
QT       +=  sql

头文件://数据库对象#include<QSqlDatabase>//执行sql语句的对象#include<QSqlQuery>//数据库错误#include<QSqlError>
QSqlDatabase db;
构造:
//1.配置数据库驱动(当前工程使用sqlite)
    db =QSqlDatabase::addDatabase("QSQLITE");//2.设置数据库文件名字 student.db文件
    db.setDatabaseName("student.db");//3.开启数据库//db.open();//4.创建表createTable();//创建表voidMainWindow::createTable(){//1.打开数据库if(db.open()){//2.执行sql语句的对象
        QSqlQuery query;//准备sql语句//字段:1)整形 主键自增id 2)字符串 姓名 3)整形年龄 4)整形的分数//主键:表中的一条记录的唯一标识  不可以重复//if not exists:避免表的重复创建//autoincrement:自增,从1开始 每次加1
        QString sql ="create table if not exists info_student "//折行自动生成的双引号不要删"(id integer primary key autoincrement,""name varchar(20),""age integer,""score integer);";//去数据库执行sql语句if(query.exec(sql))qDebug()<<"学生信息表创建成功";elseqDebug()<<"学生信息表创建失败";}else{qDebug()<<"数据库打开失败";}
    db.close();//关闭数据库}//插入数据voidMainWindow::insertData(){//获取输入框中的姓名 年龄 分数
    QString name = ui->lineEdit_name->text();int age = ui->lineEdit_age->text().toInt();int score = ui->lineEdit_score->text().toInt();//打开数据库,准备sql 执行sqlif(db.open()){//先放入占位符
        QString sql ="INSERT into info_student (name,age,score) values(?,?,?);";

        QSqlQuery query;//1.准备sql语句(语句还不完整,没有绑入确切的值)
        query.prepare(sql);//2.绑入值
        query.bindValue(0,name);
        query.bindValue(1,age);
        query.bindValue(2,score);//3.执行语句if(query.exec()){qDebug()<<"插入成功";
            ui->lineEdit_age->clear();
            ui->lineEdit_name->clear();
            ui->lineEdit_score->clear();}elseqDebug()<<"插入失败";}elseqDebug()<<"数据库打开失败";
    db.close();}//查询提取数据voidMainWindow::selectData(){
    ui->textBrowser->clear();//打开数据库,准备sql 执行sqlif(db.open()){
        QString sql ="SELECT * FROM info_student where score between 70 and 90;";
        QSqlQuery query;
        query.exec(sql);//提取和显示查询后的结果//query.next()是否还有可显示的数据while(query.next()){//一行数据,按照字段提取数据值 id name age scoreint id = query.value(0).toInt();
            QString name = query.value(1).toString();int age = query.value(2).toInt();int score = query.value(3).toInt();//显示,拼接字符串
            QString str =QString("id:%1  name:%2  age:%3  score:%4").arg(id).arg(name).arg(age).arg(score);
            ui->textBrowser->append(str);}}elseqDebug()<<"数据库打开失败";
    db.close();}

8.级联分类器

头文件:
CascadeClassifier classifier;
vector<Rect> findFaces;//存储找到的人脸矩形

构造:
classifier =CascadeClassifier("D:/QT/opencv3.4-install/install/etc/haarcascades/haarcascade_frontalface_alt2.xml");//数据模型的路径

定时器事件:
cv::resize(src,src,Size(ui->label_vidio->width(),ui->label_vidio->height()));//图片大小适应控件大小flip(src,src,1);//y轴翻转
Mat gray;cvtColor(src,gray,CV_BGR2GRAY);//转灰度
classifier.detectMultiScale(gray,findFaces);//把gray灰度图中找到的人脸矩形保存在findFaces容器中for(int i=0;i<findFaces.size();i++){rectangle(src,findFaces[i],Scalar(0,0,255),2);}
ui->label_vidio->setPixmap(convertCv2Qt(src));

9.人脸识别器

#include<opencv2/face.hpp>usingnamespace cv::face;
头文件:
vector<Mat> studyFaces;//要学习的人脸容器
vector<int> studyLables;//标签//人脸识别器对象
Ptr<FaceRecognizer> recognizer;

构造:
    //人脸识别器初始化
    QFile file("face.xml");//build文件夹下//判断这个模型文件是否存在if(file.exists())//开机的时候从芯片里读出之前的数据{//加载旧数据(之前录入过的)
        recognizer = FaceRecognizer::load<LBPHFaceRecognizer>("face.xml");}else{//创建新的人脸识别器对象
        recognizer =LBPHFaceRecognizer::create();}

机器学习:
//录入 机器学习过程:1.存图片的容器  2.存储对应相同数量的标签的容器voidMainWindow::on_pushButton_study_clicked(){//1.准备想录入的人员的图片for(int i=0;i<9;i++){
        QString path =QString("D:/QT/img/study/s%1.jpg").arg(i);
        Mat face =imread(path.toStdString());//统一操作:1.转灰度 2.统一大小100*100cvtColor(face,face,CV_BGR2GRAY);
        cv::resize(face,face,Size(100,100));
        studyFaces.push_back(face);}//2.每张图片 配一个整形的标签for(int i=0;i<9;i++){
        studyLables.push_back(i);}//3.更新数据模型
    recognizer->update(studyFaces,studyLables);//4.保存数据模型
    recognizer->save("face.xml");}

识别人脸:
voidMainWindow::on_pushButton__clicked(){//1.通过级联分类器 找到人
    Mat src =imread("D:/QT/img/head2.jpg");
    CascadeClassifier classifier =CascadeClassifier("D:/QT/opencv3.4-install/install/etc/haarcascades/haarcascade_frontalface_alt2.xml");
    vector<Rect> findFaces;
    Mat gray;cvtColor(src,gray,CV_BGR2GRAY);
    classifier.detectMultiScale(gray,findFaces);qDebug()<<"找到:"<<findFaces.size();//2.找到的人去和模型文件中的人去对比double confidence =0;int lable =0;for(int i=0;i<findFaces.size();i++){//把矩形的范围抠图下来
        Mat face =src(findFaces[i]);//imshow("face",face);cvtColor(face,face,CV_BGR2GRAY);
        cv::resize(face,face,Size(100,100));//3.预测完成后,返回 1.可信度(越小越准) 2.标签
        recognizer->predict(face,lable,confidence);qDebug()<<"confi:"<<confidence<<"lable:"<<lable;}}

10.自定义定时器

头文件:
#include<QTimer>voidslot_studyTimer();
QTimer studyTimer;
构造:
connect(&studyTimer,SIGNAL(timeout()),this,SLOT(slot_studyTimer()));
实现:
studyTimer.start(1000);voidMainWindow::slot_studyTimer(){
    ui->label_2->setNum(++count_study);}

本文转载自: https://blog.csdn.net/qq_41796226/article/details/126869449
版权归原作者 摁回车的大雷 所有, 如有侵权,请联系我们删除。

“opencv的基础用法及其在QT中的应用”的评论:

还没有评论