计算机视觉:图像分类定位(单一目标检测)python实现
前言
目标检测:我们不仅要用算法判断图片中是不是猫还是狗, 还要在图片中标记出它的位置, 用边框或红色方框把猫狗圈起来, 这就是目标检测问题。其中“定位”的意思是判断猫狗在图片中的具体位置。
目标检测有两类任务:单一目标 ,多目标。
能力差,电气专业,又未怎么深入研究cv.
所以本文先探讨单一目标。
HOG+SVM实现行人检测
先讲解 opencv自带的行人检测例子
HOG原理见
计算机视觉:图像特征与描述大全 ,有代码(一篇博文带你简单了解完图像特征提取技术)
不多说,上代码
import cv2 as cv# 读取图像
src = cv.imread("duoren.jpg")
cv.imshow("input", src)
# HOG + SVM
hog = cv.HOGDescriptor()
hog.setSVMDetector(cv.HOGDescriptor_getDefaultPeopleDetector())
# Detect people in the image
(rects, weights) = hog.detectMultiScale(src,winStride=(4, 4), padding=(8, 8),scale=1.25,useMeanshiftGrouping=False)
# 矩形框
for (x, y, w, h) in rects:cv.rectangle(src, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 显示[添加链接描述](https://blog.csdn.net/kobeyu652453/article/details/107382227)
cv.imshow("result", src)
cv.waitKey(0)
cv.destroyAllWindows()
图像定位实现
python +keras实现图像分类(入门级例子讲解)
opencv进阶学习笔记12:轮廓发现和对象测量
目标检测算法很复杂。
我尝试用 图像分类+对象测量 来实现单目标的图像检测。
图像分类 对象测量 不多说了,参考上面给的链接。
1读取图片并去噪
import cv2 as cvimage= cv.imread("catdog/dog/dog.77.jpg")
image=cv.resize(image,None,fx=0.5,fy=0.5)
blurred = cv.GaussianBlur(image, (5, 5), 0) # 去噪
2二值化图像
gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
3绘制轮廓边缘
contours, hireachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
cv2.findContours()函数第一个参数是要检索的图片,必须是为二值图,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图,
参数讲解
contours,hierarchy=cv2.findContours(image,mode,method)
contours:轮廓
hierarchy:图像的拓扑信息(轮廓层次)(存储上一个轮廓,父轮廓…)
image:二值图像
mode:轮廓检索方式
method:轮廓的近似方法
4求得包含点集最小面积的矩形,这个矩形是可以有偏转角度的,可以与图像的边界不平行。
c = sorted(contours, key=cv.contourArea, reverse=True)[0]rect = cv.minAreaRect(c)
box = np.int0( cv.boxPoints(rect))# draw a bounding box arounded the detected barcode and display the image
cv.drawContours(image, [box], -1, (0, 255, 0), 3)
讲解
double cvContourArea( const CvArr* contour, CvSlice slice=CV_WHOLE_SEQ );
contour:轮廓(顶点的序列或数组)。
slice:感兴趣区轮廓部分的起点和终点,默认计算整个轮廓的面积。
c = sorted(contours, key=cv.contourArea, reverse=True)[0]
取出最大的轮廓面积,有些轮廓为噪声。
最大轮廓一般情况下能取到我们想要的目标物。
minAreaRect函数返回矩形的中心点坐标,长宽,旋转角度[-90,0),当矩形水平或竖直时均返回-90
使用cv2.boxPoints()可获取该矩形的四个顶点坐标。 浮点型数据
np.int0 取整
r=cv2.drawContours(image, contours, contourIdx, color[, thickness])
r:目标图像
image:原始图像
contours: 所有的输入轮廓边缘数组
contourIdx :需要绘制的边缘索引,如果全部绘制为-1。如果有多个目标,可以绘制第一个目标0,第二个目标1,第三个目标2.。。
color:绘制的颜色,为BGR格式的SCalar
thickness:可选,绘制的密度,即轮廓的画笔粗细
5找出四个顶点的x,y坐标的最大最小值。矩形框的高=maxY-minY,宽=maxX-minX。
由于前面的提到的 包含点集最小面积的矩形 有的矩形不与图像平行,是斜着的,如下图。我们调整矩形框。
Xs = [i[0] for i in box]Ys = [i[1] for i in box]x1 = min(Xs)x2 = max(Xs)y1 = min(Ys)y2 = max(Ys)hight = y2 - y1width = x2 - x1cropImg = image[y1:y1 + hight, x1:x1 + width]cv.rectangle(image, (x1, y1), (x1 + width, y1 +hight ), (0, 0, 255), 2) # 在原图上,给轮廓绘制矩形cv.imshow('result',image)
所有代码
import cv2 as cv
import numpy as np
src= cv.imread("dog.16.jpg")
src=cv.resize(src,None,fx=0.5,fy=0.5)
image=src.copy()
#去噪
blurred = cv.GaussianBlur(image, (5, 5), 0) # 去噪
#灰度转换
gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)
#二值化
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
#轮廓发现
contours, hireachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
#取出最大轮廓
c = sorted(contours, key=cv.contourArea, reverse=True)[0]
#找到最大轮廓的最小外接矩形
rect = cv.minAreaRect(c)
#取出最小外接矩形的四个顶点
box = np.int0( cv.boxPoints(rect))
#绘制矩形框
Xs = [i[0] for i in box]
Ys = [i[1] for i in box]
x1 = min(Xs)
x2 = max(Xs)
y1 = min(Ys)
y2 = max(Ys)
hight = y2 - y1
width = x2 - x1
cropImg = image[y1:y1 + hight, x1:x1 + width]
cv.rectangle(image, (x1, y1), (x1 + width, y1 + hight), (0, 0, 255), 2) # 在原图上,给轮廓绘制矩形
#显示
cv.imshow("input image", src)
cv.imshow('result', image)cv.waitKey(0)
cv.destroyAllWindows()
图像分类定位实现
我应用图像分类 加前面提到的定位 结合起来做 单目标的图像监测。
图像分类前面给出了链接,这里不再给啦,博文太多链接了,会被显示待审核。
PYQT 封装吧。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu
# @Date : 2020/8/1
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *import cv2
import keras
from keras .models import load_model
import numpy as np
import re
class picture(QWidget):def __init__(self):super(picture, self).__init__()self.resize(600, 400)self.setWindowTitle("猫狗分类")self.btn = QPushButton()self.btn.setText("打开图片")self.btn.clicked.connect(self.openimage)self.label = QLabel()self.label.setText('图片路径')self.labelimage = QLabel()self.labelimage.setText("显示图片")#self.labelimage.setFixedSize(500, 400)#设置尺寸self.labelimage.setStyleSheet("QLabel{background:white;}""QLabel{color:rgb(300,300,300,120);font-size:10px;font-weight:bold;font-family:宋体;}")#预测按钮self.btnclass=QPushButton()self.btnclass.setText('点击预测分类')self.btnclass.clicked.connect(self.fenlei)self.labelclass=QLabel()self.labelclass.setText('预测类别')self.labelclass.setStyleSheet("font:16pt '楷体';border-width:2px;border-style: inset;border-color:gray")layout1=QVBoxLayout()layout1.addWidget(self.btn)layout1.addWidget(self.label)layout1.addWidget(self.labelimage)layout2 = QVBoxLayout()layout2.addWidget(self.btnclass)layout2.addWidget(self.labelclass)layout=QVBoxLayout()layout.addLayout(layout1)layout.addLayout(layout2)self.setLayout(layout)def openimage(self):imgName, imgType = QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")#jpg = QtGui.QPixmap(imgName).scaled(self.labelimage.width(), self.label.height())#适应labelimage尺寸,前提是label设置了尺寸jpg = QtGui.QPixmap(imgName)self.labelimage.setPixmap(jpg)self.label.setText(str(imgName))def fenlei(self):biaoqian = {'1': '猫', '0': '狗'}path=self.label.text()newName = re.sub('(D:/机器学习/学习草稿/)','', path)#print(newName)img = cv2.imread(str(newName))img = cv2.resize(img, (100, 100)) # 使尺寸大小一样img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)img = np.array(img) / 255img = img.astype(np.float64)img = img.reshape(-1, 100, 100, 1)model = load_model('猫狗分类.h5')predict_y = model.predict(img)pred_y = int(np.round(predict_y))#print(pred_y)self.labelclass.setText(biaoqian[str(pred_y)])########图像定位src = cv2.imread(str(newName))src = cv2.resize(src, None, fx=0.5, fy=0.5)image = src.copy()# 去噪blurred = cv2.GaussianBlur(image, (5, 5), 0) # 去噪# 灰度转换gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)# 二值化ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)# 轮廓发现contours, hireachy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 取出最大轮廓c = sorted(contours, key=cv2.contourArea, reverse=True)[0]# 找到最大轮廓的最小外接矩形rect = cv2.minAreaRect(c)# 取出最小外接矩形的四个顶点box = np.int0(cv2.boxPoints(rect))# 绘制矩形框Xs = [i[0] for i in box]Ys = [i[1] for i in box]x1 = min(Xs)x2 = max(Xs)y1 = min(Ys)y2 = max(Ys)hight = y2 - y1width = x2 - x1cropImg = image[y1:y1 + hight, x1:x1 + width]cv2.rectangle(image, (x1, y1), (x1 + width, y1 + hight), (0, 0, 255), 2) # 在原图上,给轮廓绘制矩形#显示在lableimage上res = imageres = cv2.resize(res, (400, 300), interpolation=cv2.INTER_CUBIC) # 用cv2.resize设置图片大小img2 = cv2.cvtColor(res, cv2.COLOR_BGR2RGB) # opencv读取的bgr格式图片转换成rgb格式_image = QtGui.QImage(img2[:], img2.shape[1], img2.shape[0], img2.shape[1] * 3,QtGui.QImage.Format_RGB888) # pyqt5转换成自己能放的图片格式jpg_out = QtGui.QPixmap(_image) # 转换成QPixmapself.labelimage.setPixmap(jpg_out) # 设置图片显示cv2.waitKey()cv2.destroyAllWindows()if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)my = picture()my.show()sys.exit(app.exec_())
说明:
model = load_model(‘猫狗分类.h5’)
导入训练好的分类模型
在PYQT中显示opencv图 核心代码
def setImage(self):img = cv2.imread('test.jpg') #opencv读取图片img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #opencv读取的bgr格式图片转换成rgb格式_image = QtGui.QImage(img2[:], img2.shape[1], img2.shape[0], img2.shape[1] * 3, QtGui.QImage.Format_RGB888) #pyqt5转换成自己能放的图片格式jpg_out = QtGui.QPixmap(_image).scaled(self.imgLabel.width(), self.imgLabel.height()) #设置图片大小self.imgLabel.setPixmap(jpg_out) #设置图片显示
结果演示
本文给出的方法不是纯粹的目标检测算法。定位有的图有所缺陷。
只是图像分类+对象测量 来实现单一目标检测功能
等我有时间研究下目标检测算法后,再来写博文。
电气专业的计算机萌新:余登武,写博文不容易,如果你觉得本文对你有用,请点个赞支持下,谢谢。
计算机视觉:图像分类定位(单一目标检测)python实现相关推荐
- 计算机视觉:单阶段目标检测模型YOLO-V3
计算机视觉:单阶段目标检测模型YOLO-V3 单阶段目标检测模型YOLO-V3 YOLO-V3 模型设计思想 产生候选区域 生成锚框 生成预测框 对候选区域进行标注 标注锚框是否包含物体 标注预测框的 ...
- 计算机视觉(一)—— 目标检测和边界框
文章目录 1. 什么是目标检测 2. 目标检测大致思路 2.1 边界框 2.2 合理的边界框? 2.2.1 某一种锚框的生成方法 2.2.1.1 方法描述 2.2.1.2 代码 2.2.2 锚框优劣的 ...
- 【毕业设计】深度学习行人车辆流量计数系统 - 目标检测 python
文章目录 0 前言 1. 目标检测概况 1.1 什么是目标检测? 1.2 发展阶段 2. 行人检测 2.1 行人检测简介 2.2 行人检测技术难点 2.3 行人检测实现效果 2.4 关键代码-训练过程 ...
- 2019.7学习总结-目标检测-Python+pytorch
目录 1.基础知识 1.1.dict的copy: 1.2.torch.cuda.synchronize() 1.3.在CenterNet里 1.4.torch.gather.topk用法: 1.5.t ...
- 计算机视觉与深度学习 | 目标检测综述(RCNN、RPN、YOLOv1 v2 v3、FPN、Mask RCNN、SSD代码类)
博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 github链接:https:// ...
- 2022 计算机视觉顶会论文----目标检测
1.Dual Cross-Attention Learning for Fine-Grained Visual Categorization and Object Re-Identification ...
- 计算机视觉六大技术:图像分类、目标检测、目标跟踪、语义分割、实例分割、影像重建..
计算机视觉是使用计算机及相关设备对生物视觉的一种模拟.它的主要任务就是通过对采集的图片或视频进行处理以获得相应场景的三维信息,就像人类和许多其他类生物每天所做的那样. 计算机视觉既是工程领域,也是科学 ...
- python成绩统计及格学平成_基于深度学习的目标检测算法综述
导言目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一.由于各类物体有不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是机器视 ...
- 目标检测经典论文——R-CNN论文翻译(纯中文版):用于精确物体定位和语义分割的丰富特征层次结构(技术报告(第5版))
目标检测经典论文翻译汇总:[翻译汇总] 翻译pdf文件下载:[下载地址] 此版为纯中文版,中英文对照版请稳步:[R-CNN中英文对照版] 用于精确物体定位和语义分割的丰富特征层次结构 技术报告(第5版 ...
最新文章
- wps不能打印_excel小技巧:在手机上的文件的保存、分享、打印
- 中大型网站技术架构演变过程
- 机器学习(part4)--模型评估
- php 输出读取结果集,php获取数据库结果集实例详解
- java学习(15):巩固练习
- Android官方开发文档Training系列课程中文版:手势处理之ViewGroup的事件管理
- 二进制法生成1-n的子集
- Java中逗号运算符的使用
- 大数据杀熟,是真的吗?
- 昔日最有前途的 Java 最终还是败给了晚辈 Python
- NSString NSURL
- VMWare安装苹果Mac OS X
- 简单有用的jar包下载方法及地址
- python与Android有关的库,这15个Android开源库,只有经常逛Github的才知道!
- 【OpenCV】OpenCV实战从入门到精通之五 -- 教你使用Rect()函数
- 最小割集Stoer-Wagner算法
- Xuxiang Qi--Deep Learning based Semantic Labelling of 3D Point Cloud in Visual SLAM
- cat tee ||
- 文件 MD5 SHA1 SHA256 SHA512 校验码生成工具 V1.3
- webAppRootKey
热门文章
- 【如何在IDEA中修改连接git远程库中的密码,史上最详细,建议收藏!】
- java制作带有logo的二维码,解决zxing中文乱码
- 【身份认证与控制二】分布式session共享(序列化问题)
- JavaScript——使用正则表达式提取指定格式内容
- JetBrains——账户登录错误(JetBrains Account Error:JetBrains Account connection error: www.jetbrains.com)解决方案
- 香甜的黄油 Sweet Butter
- java如何调用系统保存框_java使用poi实现excel导出之后如何弹出保存提示框
- 【项目实战】vue-springboot-pytorch前后端结合pytorch深度学习 html打开本地摄像头 监控人脸和记录时间
- ubuntu上训练yolov3: Caught ValueError in DataLoader worker process 0. string indices must be integers.
- 操作系统【逻辑空间、物理空间与页表大小的关系】【分页地址映射(方法+例题)】