OpenCV(6):基于本地库的图像识别软件(批量读取图片)
为了识别宠物的种类以及其他的扩展功能,我参考网上的识图软件原理,写了一个简化版的demo:从本地的库中匹配与所选图片最像的图片。(1.具体的其他代码可以参考其他博客的文件;2.所有文件路径改成自己的即可)
ShiBie.h:
#pragma once#ifdef WIN32 #pragma execution_character_set("utf-8") #endif#include <opencv2/opencv.hpp>
#include <QtWidgets/QMainWindow>
#include "ui_ShiBie.h"
#include "qmessagebox.h"
#include<QGraphicsScene>
#include<QGraphicsView> //graphicsview类
#include<opencv2\imgproc\imgproc.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp> //opencv申明
#include <qfiledialog.h> //getopenfilename 类申明
#include <qlabel.h>
#include "QtMainWin.h"
#include <vector>
#include <string>
#include <iostream>
#include <fstream>
using namespace cv;
using namespace std;class ShiBie : public QMainWindow //注意继承
{Q_OBJECTpublic:ShiBie(QWidget *parent = Q_NULLPTR);~ShiBie();public slots:void on_Return_ShiBie_clicked();void on_Choose_but_clicked();void on_Start_but_clicked();private:Ui::ShiBie ui;Mat image_chose;QString filename;string str;QLabel *label_1;QLabel *label_2;
};
ShiBie.cpp:
#include "ShiBie.h"
#include "progress.h"
using namespace cv;
using namespace std;
ShiBie::ShiBie(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);
}ShiBie::~ShiBie()
{}void ShiBie::on_Return_ShiBie_clicked()
{QtMainWin *w = new QtMainWin(this);w->show();this->hide();}
void ShiBie::on_Choose_but_clicked()
{filename = QFileDialog::getOpenFileName(this,tr("选择图片"),"",tr("Images(*.png *.bmp *.jpg *.tif *.GIF)"));if (filename.isEmpty()){return;}else{str = filename.toStdString(); // 将filename转变为string类型; image_chose = imread(str, CV_LOAD_IMAGE_COLOR);cvtColor(image_chose, image_chose, CV_BGR2RGB);cv::resize(image_chose, image_chose, Size(400, 350));QImage img_1 = QImage((const unsigned char*)(image_chose.data), image_chose.cols, image_chose.rows, QImage::Format_RGB888);label_1 = new QLabel();label_1->setPixmap(QPixmap::fromImage(img_1));label_1->resize(QSize(img_1.width(), img_1.height()));ui.Picture1->setWidget(label_1);}}
void ShiBie::on_Start_but_clicked()
{if (image_chose.empty()){QMessageBox::warning(this, "Warning", "请确认选择添加图片",QMessageBox::Ok);return;}int min_value = 100;int now_value;Mat similar_img;string catalog = "D:\\PicPro\\Picture_Lib";std::vector<cv::String> image_files ;glob(catalog, image_files);for (unsigned int frame = 0; frame < image_files.size(); ++frame) {Mat image = imread(image_files[frame]);if (image.empty()){QMessageBox::warning(this, "Warning", "没有图片",QMessageBox::Ok);return;}progress pro;now_value=pro.chuli(image,image_chose);if (now_value < min_value){min_value = now_value;similar_img = image.clone();}}if (similar_img.empty()){QMessageBox::warning(this, "Warning", "没有相似的图片",QMessageBox::Ok);return;}cvtColor(similar_img, similar_img, CV_BGR2RGB);cv::resize(similar_img, similar_img, Size(400, 350));QImage img_2 = QImage((const unsigned char*)(similar_img.data), similar_img.cols, similar_img.rows, QImage::Format_RGB888);label_2 = new QLabel();label_2->setPixmap(QPixmap::fromImage(img_2));label_2->resize(QSize(img_2.width(), img_2.height()));ui.Picture1_2->setWidget(label_2);}
效果图:
总结:
1.学习了opencv中批量读取图像的文件的办法。
2.基本功能目前已全部解决,对opencv的基础使用用了一定了解。
3.算法都是基于一个最简单的哈希值算法,想要接触更多的算法务必要进行进一步的理论学习了。
OpenCV(6):基于本地库的图像识别软件(批量读取图片)相关推荐
- C#基于Emgucv编写的图像识别软件,内包含自己编辑控件库,优化识别效率比传统匹配方法要快
C#基于Emgucv编写的图像识别软件,内包含自己编辑控件库,优化识别效率比传统匹配方法要快. 可随意设置ROI区域,适配各种像素大小图片识别. ID:22200653550517927甜萝卜125
- 用条码打印软件批量打印图片
我们在用条码打印软件制作商品标签的时候,标签上的条形码和二维码是可以直接在软件中绘制,但是有时候我们会批量打印带图片的学生证.工作证等标签的时候,或者将本来就有的条形码.二维码图片批量导入到软件中直接 ...
- opencv中批量读取图片并保存
之前一直在写python,突然要用C++,因为涉及到图像处理,需要批量读取并存储图片,这里对图片的批量处理代码做一下汇总: 方法1:比较简单,唯一的要求就是文件夹下的图片名称是有规律的,比如1,2,3 ...
- 图片采集软件-批量网页图片数据采集免费
图片采集软件,什么是图片采集软件.今天给大家分享一款图片采集软件,自动去除水印保存本地支持云存储,详细参考图片!!!! 白帽SEO就是采用正轨SEO的办法,合理优化网站,进步用户体验,合理与其他网站互 ...
- 如何提取小程序/APP/网页里图片视频,小程序APP素材抓取软件批量下载图片音频?
通常我们在看到某一个好的小程序素材想下载来参考时?会思考以下问题: "怎么下载别人小程序里的图标呀?" "怎么抓取小程序的图片.图标之类的?" "怎么 ...
- opencv图像处理时使用stringstream批量读取图片,处理后并保存
简介: 同文件输入输出流一样,使用stringstream可以批量读取图片,处理后并进行保存.因为C++中头文件 stringstream既可以从string读数据也可向string写数据,利于其这个 ...
- 不用软件批量缩小图片文件的大小
可以利用windows的发送到来达到你要的目的,具体方法如下: 全选要缩小的图片,单击鼠标右键,选择发送到"邮件收件人" 在弹出的对话框中单击"显示更多选项", ...
- 利用opencv带你玩转人脸识别-上篇(读取图片,灰度转换,尺寸修改,绘制矩形快速入门)
- OpenCv中批量读取图片数据并显示出来的C++程序
/*************************************************************************************************** ...
最新文章
- 全面解析RS232、RS485、RS422、RJ45接口的区别和各自的应用
- 继承“HibernateDaoSupport”后,报“The hierarchy of the type AccoutDaoImpl is inconsistent”的解决方案...
- Android4.1 onTouchEvent分析 (选字模式等)
- HDU - 6899 Xor(数位dp)
- 学号20145209《信息安全系统设计基础》第11周学习总结
- emacs org 日历_发送电子邮件并使用Emacs检查您的日历
- 【Flink】This YARN version does not support getSchedulerResourceTypes
- php网页事件处理方法,PHP实现事件机制的方法
- 12.万无一失:网站的高可用架构
- 浅谈博客、微博与轻博客的区别与联系
- 《算法导论3rd第十二章》二叉查找树
- ES3,ES5,ES6的区别
- windows x64和x86的区别
- iOS数据持久化设计
- 学习秦始皇 五招打造无敌团队
- 【php】php中call_user_func函数的用法
- 三件事看优酷关于视频网站版权的问题
- 解决word2007不能编辑文档的问题
- ERROR:function cannot execute on a QE slice/Greenplum 错误解决
- 【VR开发篇】Unity3D 使用物理公式实现抛物线传送功能