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

这篇具有很好参考价值的文章主要介绍了Python相机自动采集图像,然后模板匹配、自动截取保存图片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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


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

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

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

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

二、主要使用代码

import os
import cv2
import time
import numpy as np


def 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 keep


def 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 + w
    ymax = ymin + h

    xmin = 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 dets

def 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)#获取视频fps
    print("[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'):  # 中断采集
                break
            if frame_index == 101:  # 拍摄多少张停止
                break
            print(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_name1
            retval, 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 += 1

    cv2.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.模板图像

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

2.拍摄图片

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

3.匹配效果

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

 4.提取效果

Python相机自动采集图像,然后模板匹配、自动截取保存图片,python,opencvPython相机自动采集图像,然后模板匹配、自动截取保存图片,python,opencv文章来源地址https://www.toymoban.com/news/detail-532190.html

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


总结

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

到了这里,关于Python相机自动采集图像,然后模板匹配、自动截取保存图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图像识别基础之模板匹配

    图像匹配 本质:图像的相似度很高(矩阵的相似度很高)

    2024年02月20日
    浏览(35)
  • Opencv——图像模板匹配

    什么是模板匹配呢? 看到这里大家是否会觉得很熟悉的感觉涌上心头!在人脸识别是不是也会看见 等等。 模板匹配可以看作是对象检测的一种非常基本的形式。使用模板匹配,我们可以使用包含要检测对象的“模板”来检测输入图像中的对象。 参数:(img: 原始图像、

    2024年02月16日
    浏览(43)
  • 【图像处理】模板匹配的学习笔记

    cv.TM_CCOEFF cv.TM_CCOEFF_NORMED cv.TM_CCORR cv.TM_CCORR_NORMED cv.TM_SQDIFF cv.TM_SQDIFF_NORMED Note: cv2.TM_CCOEFF_NORMED :相较于其它方法,通常被认为具有较好的鲁棒性

    2024年02月10日
    浏览(33)
  • 图像模板匹配 opencv c++实现

    用T表示模板图像,I表示待匹配图像,切模板图像的宽为w高为h,用R表示匹配结果,匹配过程如下图所示: 1、平方差匹配算法method=TM_SQDIFF 这类方法利用平法差来进行匹配,最好匹配为0,而若匹配越差,匹配值则越大 2、归一化平方差匹配法method=TM_SQDIFF_NORMED 3、相关匹配法

    2024年02月04日
    浏览(46)
  • 图像处理 边缘检测 绘制金字塔 模板匹配

    Canny边缘检测器是一种多步算法,用于检测任何输入图像的边缘。 边缘检测步骤: 1.应用 高斯滤波器 ,以平滑图像,滤除噪声( 降噪 ) 2.计算图像中每个像素点的梯度大小(边缘两侧和卷积之间的像素差值和方向(x和y方向)(梯度Scole算子检测边缘) 3.使用非极大值抑制,

    2024年02月06日
    浏览(53)
  • 自动驾驶采集多视角图像处理(python实现不同文件夹下同名图片批量拼接并生成视频)

    目录 1.图像拼接 2.合成视频 2.1 cv2.videowriter_fourcc功能介绍 2.2读取图片合成视频 实现目标:将自动驾驶车6个摄像头采集到的图片,按照正确顺序拼接显示,nuScenes数据集测试如下: 图像存放文件夹目录如下: 每个目录下有相同名称,不同视角采集到的图像 。 先显示图片,代

    2024年01月18日
    浏览(66)
  • OpenCV数字图像处理实战二:模板匹配(C++)

    (1)首先需要一个模板图像 T(子图像)和一个待检测的图像(源图像 S) (2)在待检测图像从左到右,从上到下计算模板图像与重叠子图像的匹配度,匹配度越高,两者相同的可能性越大。 3.1 单模板匹配 注意:result的长宽正好是(原图-模板图)的长宽,result图中白亮程

    2024年02月15日
    浏览(46)
  • (二)Qt多线程实现海康工业相机图像实时采集

    提示:这里是该系列文章的所有文章的目录 第一章: (一)Qt+OpenCV调用海康工业相机SDK示例开发 第二章: (二)Qt多线程实现海康工业相机图像实时采集 本文主要讲述了使用Qt多线程实现海康工业相机图像的采集,并在界面上将两个相机采集到的图像信息同时显示出来,在

    2024年02月04日
    浏览(53)
  • Qt+OpenCV调用海康相机SDK采集图像(C++)

    配置环境: Qt5.12.5 OpenCV3.4.9 海康MVS3.1.0 开发工具:QT Creator-4.11.0 1.1)添加海康的库: 将海康SDK库MVSDevelopmentIncludes和MVSDevelopmentLibrarieswin64下复制到自己的工程目录下 然后把库添加到.pro文件中 点击下一步之后就会在.pro文件中出现如下代码 然后在这后面加上以下代码,添

    2024年02月08日
    浏览(47)
  • opencv基础57-模板匹配cv2.matchTemplate()->(目标检测、图像识别、特征提取)

    OpenCV 提供了模板匹配(Template Matching)的功能,它允许你在图像中寻找特定模板(小图像)在目标图像中的匹配位置。模板匹配在计算机视觉中用于目标检测、图像识别、特征提取等领域。 以下是 OpenCV 中使用模板匹配的基本步骤: 加载图像 : 首先,加载目标图像和要匹配

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包