前言

通过python调用相机然后间隔一段时间进行拍摄图片,进行识别提取。


提示:以下是本篇文章正文内容,下面案例可供参考

一、确保电脑存在相机等硬件设备

我的电脑没有相机硬件设备,于是我通过手机在局域网的状态下进行图像传输到电脑上,在这里特别推荐软件:DroidCam Client    建议大家按照情况自行安装。

二、主要使用代码

import os
import cv2
import time
import numpy as npdef py_nms(dets, thresh):#(模板匹配得到的符合范围的矩阵值,抑制的阈值)"""Pure Python NMS baseline."""# x1、y1、x2、y2、以及score赋值# (x1、y1)(x2、y2)为box的左上和右下角标x1 = dets[:, 0]y1 = dets[:, 1]#左上角的坐标值x2 = dets[:, 2]y2 = dets[:, 3]#右下角的阈值scores = dets[:, 4]# 每一个候选框的面积areas = (x2 - x1 + 1) * (y2 - y1 + 1)# order是按照score降序排序的,从大到小order = scores.argsort()[::-1]# print("order:",order)keep = []while order.size > 0:i = order[0]keep.append(i)# 计算当前概率最大矩形框与其他矩形框的相交框的坐标,会用到numpy的broadcast机制,得到的是向量xx1 = np.maximum(x1[i], x1[order[1:]])yy1 = np.maximum(y1[i], y1[order[1:]])xx2 = np.minimum(x2[i], x2[order[1:]])yy2 = np.minimum(y2[i], y2[order[1:]])# 计算相交框的面积,注意矩形框不相交时w或h算出来会是负数,用0代替w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)inter = w * h# 计算重叠度IOU:重叠面积/(面积1+面积2-重叠面积)ovr = inter / (areas[i] + areas[order[1:]] - inter)# 找到重叠度不高于阈值的矩形框索引inds = np.where(ovr <= thresh)[0]# print("inds:",inds)# 将order序列更新,由于前面得到的矩形框索引要比矩形框在原order序列中的索引小1,所以要把这个1加回来order = order[inds + 1]return keepdef template(img_gray, template_img, template_threshold):'''img_gray:待检测的灰度图片格式template_img:模板小图,也是灰度化了template_threshold:模板匹配的置信度'''h, w = template_img.shape[:2]#获取模板的高和宽res = cv2.matchTemplate(img_gray, template_img, cv2.TM_CCOEFF_NORMED)#模板匹配的方式start_time = time.time()loc = np.where(res >= template_threshold)  # 大于模板阈值的目标坐标,返回的就是矩阵的行列索引值,其中行坐标为坐标的y值,列坐标为x值score = res[res >= template_threshold]# 大于模板阈值的目标置信度cv2.matchTemplate(img_gray, template_img, cv2.TM_CCOEFF_NORMED)[res >= template_threshold]完整写法# 将模板数据坐标进行处理成左上角、右下角的格式xmin = np.array(loc[1])#列坐标为x值ymin = np.array(loc[0])#横坐标为y值xmax = xmin + wymax = ymin + hxmin = xmin.reshape(-1, 1)  # 变成n行1列维度xmax = xmax.reshape(-1, 1)  # 变成n行1列维度ymax = ymax.reshape(-1, 1)  # 变成n行1列维度ymin = ymin.reshape(-1, 1)  # 变成n行1列维度score = score.reshape(-1, 1)  # 变成n行1列维度data_hlist = []data_hlist.append(xmin)data_hlist.append(ymin)data_hlist.append(xmax)data_hlist.append(ymax)data_hlist.append(score)data_hstack = np.hstack(data_hlist)  # 将xmin、ymin、xmax、yamx、scores按照列进行拼接       np.hstack():在水平方向上平铺  np.vstack():在竖直方向上堆叠thresh = 0.3  # NMS里面的IOU交互比阈值keep_dets = py_nms(data_hstack, thresh)#进行非极大值抑制print("nms time:", time.time() - start_time)  # 打印数据处理到nms运行时间dets = data_hstack[keep_dets]  # 最终的nms获得的矩形框return detsdef saveresult(name,file,img_rgb):isExists = os.path.exists("./"+ str(name)+'/')if not isExists:  # 判断如果文件不存在,则创建os.makedirs("./"+ str(name)+'/')print("./"+ str(name)+'/'+"目录创建成功")out =str(file.split('.')[0])filename="./"+ name+'/%s.jpg'%(out)print('已匹配图片:'+filename)cv2.imwrite(filename, img_rgb)def savecut(name,file,cut):isExists = os.path.exists("./"+ str(name)+'/')if not isExists:  # 判断如果文件不存在,则创建os.makedirs("./"+ str(name)+'/')print("./"+ str(name)+'/'+"目录创建成功")out =str(file.split('.')[0])filename="./"+ name+'/%s.jpg'%(out)print('已裁切图片:'+filename)cv2.imwrite(filename, cut)def camera(camera, save_path):cap = cv2.VideoCapture(camera)  # 打开摄像头'''frame_width=cap.get(cv2.CAP_PROP_FRAME_WIDTH)#获得视频尺寸——宽frame_height=cap.get(cv2.CAP_PROP_FRAME_HEIGHT)#高fps = cap.get(cv2.CAP_PROP_FPS)#获取视频fpsprint("[INFO]视频FPS:{}".format(fps))print("[INFO]视频宽:{}".format(frame_width))print("[INFO]视频高:{}".format(frame_height))#frame_all_fps=cap.get(cv2.CAP_PROP_FRAME_COUNT)#获取视频总帧数#print("[INFO]视频总帧数:{}".format(frame_all_fps))'''if not cap.isOpened():print("未打开摄像头!")else:print("已打开摄像头,任务开始!")frame_index = 1  # 图片计数retval, frame = cap.read()  # 这里是读取视频帧,第一个参数输出是否识别到,第二个参数输出识别到的图像帧while retval:  # 当读到图像帧时if cv2.waitKey(1) & 0xFF == ord('q'):  # 中断采集breakif frame_index == 101:  # 拍摄多少张停止breakprint(frame_index)cv2.imshow("camera_frame", frame)  # 显示视频帧cv2.waitKey(100)  # 间隔100ms拍摄一张图片save1 = str(save_path)             # jpg格式图片存放文件夹的路径isExists = os.path.exists(save1)if not isExists:  # 判断如果文件不存在,则创建os.makedirs(save1)frame_name1 = f"camera_frame_{frame_index}.jpg"frame_name2 = str(frame_name1.split('.')[0])save1 = save1 + frame_name1retval, frame = cap.read()cv2.imwrite(save1, frame)  # 保存拍摄的图片file1 = os.path.join(save1)img_rgb = cv2.imread(file1)  # 需要检测的图片img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)  # 转化成灰色template_img = cv2.imread('mb.jpg', 0)  # 模板小图template_threshold = 0.5  # 模板置信度dets = template(img_gray, template_img, template_threshold)for coord in dets:cv2.rectangle(img_rgb, (int(coord[0]), int(coord[1])), (int(coord[2]), int(coord[3])), (0, 0, 255),2)saveresult('save', frame_name2, img_rgb)if [int(coord[1]), int(coord[3]), int(coord[0]), int(coord[2])] == [0, 0, 0, 0]:print("未识别到物体")else:cut = img_rgb[int(coord[1]):int(coord[3]), int(coord[0]):int(coord[2])]  # 裁切坐标为(y0:y1,x0:x1)savecut('savepicture', frame_name2, cut)frame_index += 1cv2.destroyAllWindows()cap.release()if __name__ == "__main__":camera(0, "./images/")  #启动相机然后保存拍摄的图片print("***********************************************************************************")print('**                              已完成模板匹配任务                                  **')print("***********************************************************************************")"""
参数                      propld  功能
cv2.CAP_PROP_POS_MSEC       0   视频文件的当前位置(以毫秒为单位)或视频捕获时间戳
cv2.CAP_PROP_POS_FRAMES     1   基于0的索引将被解码/捕获下一帧
cv2.CAP_PROP_POS_AVI_RATIO  2   视频文件的相对位置:0 - 视频的开始,1 - 视频的结束
cv2.CAP_PROP_FRAME_WIDTH    3   帧的宽度
cv2.CAP_PROP_FRAME_HEIGHT   4   帧的高度
cv2.CAP_PROP_FPS            5   帧速
cv2.CAP_PROP_FOURCC         6   4个字符表示的视频编码器格式
cv2.CAP_PROP_FRAME_COUNT    7   帧数
cv2.CAP_PROP_FORMAT         8   byretrieve()返回的Mat对象的格式
cv2.CAP_PROP_MODE           9   指示当前捕获模式的后端特定值
cv2.CAP_PROP_BRIGHTNESS     10  图像的亮度(仅适用于相机)
cv2.CAP_PROP_CONTRAST       11  图像对比度(仅适用于相机)
cv2.CAP_PROP_SATURATION     12  图像的饱和度(仅适用于相机)
cv2.CAP_PROP_HUE            13  图像的色相(仅适用于相机)
cv2.CAP_PROP_GAIN           14  图像的增益(仅适用于相机)
cv2.CAP_PROP_EXPOSURE       15  曝光(仅适用于相机)
cv2.CAP_PROP_CONVERT_RGB    16  表示图像是否应转换为RGB的布尔标志
cv2.CAP_PROP_WHITE_BALANCE  17  目前不支持
cv2.CAP_PROP_RECTIFICATION  18  立体摄像机的整流标志
"""

下面是效果展示

1.模板图像

2.拍摄图片

3.匹配效果

4.提取效果

整体上,可以实现一开始想要的效果


总结

整体上,可以实现想要的效果,很感谢CSDN上众多无私的代码分享者。希望我们共同进步,如果与任何建议,欢迎大家留言讨论。要是喜欢的话欢迎大家给我点赞。

Python相机自动采集图像,然后模板匹配、自动截取保存图片相关推荐

  1. 【python版CV】图像轮廓模板匹配

    文章目录 1.图像轮廓 1.1 findContours函数: 1.2 获取轮廓信息(可能会报错原因) 1.3 绘制轮廓: 1.4 轮廓特征: 1.5 轮廓近似: 1.6 边界矩形 2.模板匹配 3. ...

  2. python cv2 matchtemplate_OpenCV-Python系列十:模板匹配

    模板匹配应用的场景非常多,OCR(字符识别),目标检测.定位等等.OpenCV中,你可以使用cv2.matchTemplate()来完成.对于其中的计算原理,可参考如下博客: cv2.matchTem ...

  3. android相机采集sdk,C#用basler相机sdk采集图像并用halcon显示的小程序

    C#用basler相机sdk采集图像并用halcon显示的小程序 C#用basler相机sdk采集图像并用halcon显示的小程序 本人在用halcon做图像处理做视觉项目时,通常都是用c#写程序的主 ...

  4. 用c语言对图像进行模板匹配,[转载]模板匹配的基本概念

    简单而言,模板就是一幅已知的小图像.模板匹配就是在一幅大图像中搜寻目标,已知 该图中有要找的目标,且该目标同模板有相同的尺寸.方向和图像,通过一定的算法可以 在图中找到目标,确定其坐标位置. 以8 位 ...

  5. VS(C#)调用Basler相机SDK采集图像及基本功能设定

    注意一定要安装那个 巴斯勒的程序后在运行代码 ,要不然就报什么组建错误 注:博主看着另外一个博主的博客才有下面的一些总结,有兴趣可以看一下:https://blog.csdn.net/qq_39930 ...

  6. python中括号配对检测_使用模板匹配在Python上进行对象检测!(附代码)

    了解如何在没有机器学习或任何框架的情况下在Python上进行对象检测 每当我们听说" 对象检测 "时,我们就会想到机器学习以及不同的框架.但是我们实际上可以在不使用机器学习或任何其 ...

  7. python opencv数字识别_基于模板匹配的手写数字识别(python+opencv)

    智能计算课第一周的实验是做基于模板匹配的手写数字识别,光听见就很感兴趣,于是决定认真做做这个实验,本实验基于python3+opencv的python版本,所用到的知识都比较简单,基本上边学边做,技术 ...

  8. 自动采集的网站源码-自动采集发布的电影小说新闻网站程序源码

    自动采集网站源码,有不少SEO的同伴们都在找可以自动采集网站源码,但是这种源码真的好吗?首先可以自动采集的网站源码程序,规则也是别人写好的,采集的内容也是别人用过的,对于网站收录肯定不是那么友好.我们 ...

  9. 对超级大的图像做模板匹配

    opencv对一张(1000000,10000000,3)的图片做模板匹配时,会出现segmention fault错误 所以我设计了一种纵向切割图像的算法,模板过大则不适用 文件夹结构: 里面的pn ...

最新文章

  1. java 将本地图片批量上传到oss服务
  2. 对Exchange 事件ID 9154 DSACCESS 返回 DS 通知出现的错误“0x80004005”的处理
  3. 手写html基础格式,手写服务器_HTML 简单入门知识
  4. VIM-配置-.vimrc
  5. c++的STL中的map(哈希表)与unordered_map
  6. 复合索引字段的排序对搜素的影响
  7. matlab ga函数,matlab遗传算法ga函数
  8. nginx做负载均衡+keepalived(做主备)
  9. c++ idea 插件_推荐 33 个 IDEA 最牛配置,写代码太爽了
  10. echarts3与echarts2区别
  11. 使用JsonArray.fromObject()需要注意的事项
  12. 基于codebook背景建模的运动目标检测
  13. 江苏省秋c语言二级用什么软件,在哪里可以查到江苏省计算机c语言二级考试资料?...
  14. VScode 光标乱跳
  15. android倒计时代码
  16. 如何给CSDN博客添加微信公众号二维码或自定义栏目
  17. 配置猫抓,抓取网页视频
  18. 【夜读】影响一生的五大定律
  19. echarts 饼状图 (数据为0或很小的扇形显示问题、扇形间隔)
  20. 华为哪款手机是鸿蒙系统_华为鸿蒙系统不会用于手机?

热门文章

  1. unity打包的windows程序运行权限问题整理
  2. 【Android 】零基础到飞升 | Git使用教程之本地仓库的基本操作
  3. 驱动程序开发:基于EC20 4G模块自动拨号联网的两种方式(GobiNet工具拨号和PPP工具拨号)
  4. 服务器被入侵网页后门,谨防“网页后门”,浅谈Webshell入侵网站的原理和预防措施...
  5. HtmlEditor在线编辑器V3.0提供Demo 下载,需要朋友们的热心反馈,才能提供src和Manage 的下载
  6. canvas绘制碰撞球动画
  7. 暴雪停服:那些解散的工作室和面临赔偿的主播。
  8. 全球与中国塑料手套箱市场深度研究分析报告
  9. 假设计算机学院二年级,小吴到剧院去看喜剧表演,当一喜剧演员表演时,他笑得前仰后合。据了解,小吴几乎未曾为这个演员的表...
  10. 警告: Exception encountered during context initialization - cancelling refresh attempt: org.springfram