为了识别宠物的种类以及其他的扩展功能,我参考网上的识图软件原理,写了一个简化版的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):基于本地库的图像识别软件(批量读取图片)相关推荐

  1. C#基于Emgucv编写的图像识别软件,内包含自己编辑控件库,优化识别效率比传统匹配方法要快

    C#基于Emgucv编写的图像识别软件,内包含自己编辑控件库,优化识别效率比传统匹配方法要快. 可随意设置ROI区域,适配各种像素大小图片识别. ID:22200653550517927甜萝卜125

  2. 用条码打印软件批量打印图片

    我们在用条码打印软件制作商品标签的时候,标签上的条形码和二维码是可以直接在软件中绘制,但是有时候我们会批量打印带图片的学生证.工作证等标签的时候,或者将本来就有的条形码.二维码图片批量导入到软件中直接 ...

  3. opencv中批量读取图片并保存

    之前一直在写python,突然要用C++,因为涉及到图像处理,需要批量读取并存储图片,这里对图片的批量处理代码做一下汇总: 方法1:比较简单,唯一的要求就是文件夹下的图片名称是有规律的,比如1,2,3 ...

  4. 图片采集软件-批量网页图片数据采集免费

    图片采集软件,什么是图片采集软件.今天给大家分享一款图片采集软件,自动去除水印保存本地支持云存储,详细参考图片!!!! 白帽SEO就是采用正轨SEO的办法,合理优化网站,进步用户体验,合理与其他网站互 ...

  5. 如何提取小程序/APP/网页里图片视频,小程序APP素材抓取软件批量下载图片音频?

    通常我们在看到某一个好的小程序素材想下载来参考时?会思考以下问题: "怎么下载别人小程序里的图标呀?" "怎么抓取小程序的图片.图标之类的?" "怎么 ...

  6. opencv图像处理时使用stringstream批量读取图片,处理后并保存

    简介: 同文件输入输出流一样,使用stringstream可以批量读取图片,处理后并进行保存.因为C++中头文件 stringstream既可以从string读数据也可向string写数据,利于其这个 ...

  7. 不用软件批量缩小图片文件的大小

    可以利用windows的发送到来达到你要的目的,具体方法如下: 全选要缩小的图片,单击鼠标右键,选择发送到"邮件收件人" 在弹出的对话框中单击"显示更多选项", ...

  8. 利用opencv带你玩转人脸识别-上篇(读取图片,灰度转换,尺寸修改,绘制矩形快速入门)

  9. OpenCv中批量读取图片数据并显示出来的C++程序

    /*************************************************************************************************** ...

最新文章

  1. 全面解析RS232、RS485、RS422、RJ45接口的区别和各自的应用
  2. 继承“HibernateDaoSupport”后,报“The hierarchy of the type AccoutDaoImpl is inconsistent”的解决方案...
  3. Android4.1 onTouchEvent分析 (选字模式等)
  4. HDU - 6899 Xor(数位dp)
  5. 学号20145209《信息安全系统设计基础》第11周学习总结
  6. emacs org 日历_发送电子邮件并使用Emacs检查您的日历
  7. 【Flink】This YARN version does not support getSchedulerResourceTypes
  8. php网页事件处理方法,PHP实现事件机制的方法
  9. 12.万无一失:网站的高可用架构
  10. 浅谈博客、微博与轻博客的区别与联系
  11. 《算法导论3rd第十二章》二叉查找树
  12. ES3,ES5,ES6的区别
  13. windows x64和x86的区别
  14. iOS数据持久化设计
  15. 学习秦始皇 五招打造无敌团队
  16. 【php】php中call_user_func函数的用法
  17. 三件事看优酷关于视频网站版权的问题
  18. 解决word2007不能编辑文档的问题
  19. ERROR:function cannot execute on a QE slice/Greenplum 错误解决
  20. 【VR开发篇】Unity3D 使用物理公式实现抛物线传送功能

热门文章

  1. 想要绘图效率节省储存空间?CAD内部图块该怎么创建?
  2. 程序员的私人外包专家
  3. matlab程序作分形蕨,matlab学习第一天笔记
  4. 复杂推理的进展与挑战——从LSAT讲起
  5. 图像处理计算机基本配置,图形图像工作的电脑配置推荐_DIY攒机硬件郎中-中关村在线...
  6. Spark on YARN - Clinet模式运行spark报错问题
  7. Android开发之自定义View(一)
  8. 一著名软件公司的java笔试算法题的答案
  9. 如何理解答案-Leo读提问的智慧(4)
  10. 前端如何实现黑夜模式