【OpenCV】(十八)答题卡识别判卷与文档ocr扫描识别

OpenCV 摄像头与视频入门(深扒版) 本文以统一心智模型贯穿始终:摄像头与视频文件均通过cv2.VideoCapture抽象处理,核心流程为“打开→读帧→处理→显示/保存”。强调帧即BGR格式的uint8 NumPy数组,坐标与颜色空间需注意错位((x,y) vs [y,x],BGR vs RGB)。内容涵盖环境安装(推荐opencv-python或headless版)、设备索引探测、分辨率/帧率设置、视频读写(含FourCC编码选择),并警示常见陷阱如read()返回元组、释放资源必要性等,实现从基础到实战的完整闭环。 阅读详情

系列内容:OpenCV概述与环境配置,OpenCV基础知识和绘制图形,图像的算数与位运算,图像视频的加载和显示,图像基本变换,滤波器,形态学,图像轮廓,图像直方图,车辆统计项目,特征检测和匹配,图像查找和拼接,虚拟计算器项目,信用卡识别项目,图像的分割与修复,人脸检测与车牌识别,目标追踪,答题卡识别判卷与文档ocr扫描识别,光流估计

(一)答题卡识别判卷

项目思路:

  • 1.图片预处理
  • 2.透视变换,把答题卡的视角拉正
  • 3.找到每个圆圈的轮廓
  • 4.通过计算非零值来判断是否答题正确

代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
#封装显示图片的函数
def cv_show(name,img):
    cv2.imshow(name, img) 
    cv2.waitKey(0)  
    cv2.destroyAllWindows()
img=cv2.imread('./paper.png')
cv_show('img',img)

#变成黑白图片
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#去掉一些噪点
blurred=cv2.GaussianBlur(gray,(5,5),0)
cv_show('blurred',blurred)

#边缘检测
edged=cv2.Canny(blurred,75,200)
cv_show('edged',edged)

#检测轮廓
cnts=cv2.findContours(edged.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[1]
#画轮廓会修改被画轮廓的图
contours_img=img.copy()
cv2.drawContours(contours_img,cnts,-1,(0,0,255),3)
cv_show('contours_img',contours_img)

#确保拿到的轮廓是答题卡的轮廓
if len(cnts)>0:
    #根据轮廓面积对轮廓进行排序
    cnts=sorted(cnts,key=cv2.contourArea,reverse=True)

    #遍历每一个轮廓
    for c in cnts:
        #计算周长
        perimeter=cv2.arcLength(c,True)
        #得到近似的轮廓
        approx=cv2.approxPolyDP(c,0.02*perimeter,True)
        #近似完了,应该只剩下四个角的坐标
        # print(c)
        # print(approx)
        if len(approx)==4:
            #保存approx
            docCnt=approx
            #找到答题卡近似轮廓,直接退出
            break


docCnt

a=np.array([[[131, 205]],

       [[119, 616]],

       [[447, 613]],

       [[430, 207]]])



#进行透视变换
#透视变换要找到变换矩阵
#变换矩阵要求原图的四个点的点坐标和变换之后的四个点坐标
#现在已经找到了原图的四个点的坐标,需要找到变换后四个点的坐标
#先对获取到的4个角点坐标按照一定的顺序排序(顺时针或逆时针)
#排序功能是一个独立功能,可以封装成一个函数
def order_points(pts):
    #创建全是0的矩阵,来接收等下找出来的四个角的坐标
    rect=np.zeros((4,2),dtype='float32')
    s=pts.sum(axis=1)
    #左上x+y最小,右下x+y最大
    rect[0]=pts[np.argmin(s)]
    rect[2]=pts[np.argmax(s)]

    #右上角x-y最小,左下角x-y最大
    diff=np.diff(pts,axis=1)
    rect[1]=pts[np.argmin(diff)]
    rect[3]=pts[np.argmax(diff)]
    return rect

#把透视变换功能封装成一个函数
def four_point_transform(image,pts):
    #对输入的四个坐标排序
    rect=order_points(pts)
    (tl,tr,br,bl)=rect

    #空间中两点的距离
    widthA=np.sqrt((br[0]-bl[0])**2+(br[1]-bl[1])**2)
    widthB=np.sqrt((tr[0]-tl[0])**2+(tr[1]-tl[1])**2)
    max_width=max(int(widthA),int(widthB))

    heightA=np.sqrt((tr[0]-br[0])**2+(tr[1]-br[1])**2)
    heightB=np.sqrt((tl[0]-bl[0])**2+(tl[1]-bl[1])**2)
    max_height=max(int(heightA),int(heightB))
    #构造变换之后的对应坐标位置
    dst=np.array([
        [0,0],
        [max_width-1,0],
        [max_width-1,max_height-1],
        [0,max_height-1]
    ],dtype='float32')

    #计算变换矩阵
    M=cv2.getPerspectiveTransform(rect,dst)
    #透视变换
    warped=cv2.warpPerspective(image,M,(max_width,max_height))
    return warped

#进行透视变换
warped=four_point_transform(gray,docCnt.reshape(4,2))
cv_show('warped',warped)
print(warped.shape)

#二值化
thresh=cv2.threshold(warped,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1]
cv_show('thresh',thresh)

#找到每一个圆圈的轮廓
cnts=cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[1]
thresh_contours=thresh.copy()
cv2.drawContours(thresh_contours,cnts,-1,255,3)
cv_show('thresh_contours',thresh_contours)

plt.imshow(thresh_contours,cmap='gray')


#遍历所有的轮廓,找到特定的宽高和特定比例的轮廓,即圆圈的轮廓
question_cnts=[]
for c in cnts:
    #找到轮廓的外接矩形
    (x,y,w,h)=cv2.boundingRect(c)
    #计算宽高比
    ar=w/float(h)

    #根据实际的情况指定标准
    if w>20 and h>20 and 0.9<=ar<=1.1:
        question_cnts.append(c)
        

len(question_cnts)

#轮廓排序封装函数
def sort_contours(cnts,method='left-to-right'):
    reverse=False
    #排序的时候,取x轴数据,i=0,取y轴数据i=1
    i=0
    if method=='right-to-left' or method=='bottom-to-top':
        reverse=True
    #按y轴坐标排序
    if method=='top-to-bottom' or method=='bottom-to-top':
        i=1
    #计算每个轮廓的外接矩形
    bounding_boxes=[cv2.boundingRect(c) for c in cnts]
    (cnts,bounding_boxes)=zip(*sorted(zip(cnts,bounding_boxes),key=lambda b:b[1][i],reverse=reverse))
    return cnts,bounding_boxes


#按照从上到下的顺序对question_cnts排序
question_cnts=sort_contours(question_cnts,method='top-to-bottom')[0]

#正确答案
ANSWER_KEY={0:1,1:4,2:0,3:3,4:1}
correct=0
for (q,i) in enumerate(np.arange(0,25,5)):
    print(q,i)
    #每次取出五个轮廓,再按x坐标从小到大排序
    cnts=sort_contours(question_cnts[i:i+5])[0]
    #遍历每一个结果
    bubbled=None
    for (j,c) in enumerate(cnts):
        #使用掩膜,即mask
        mask=np.zeros(thresh.shape,dtype='uint8')
        cv2.drawContours(mask,[c],-1,255,-1)
        # cv_show('mask',mask)
        #计算非零个数
        #先做与运算
        mask=cv2.bitwise_and(thresh,thresh,mask=mask)
        # cv_show('mask',mask)
        #计算非零个数,选中的选项,非零个数多,没选中的选项,非零个数少
        total=cv2.countNonZero(mask)

        if bubbled is None or total>bubbled[0]:
            bubbled=(total,j)

    color=(0,0,255)
    k=ANSWER_KEY[q]
    #判断是否做题正确
    if k==bubbled[1]:
        correct+=1
        color=(0,255,0)

    #绘图
    cv2.drawContours(warped,[cnts[k]],-1,color,3)

#计算分数
score=(correct/5.0)*100
print(f'score:{score:.2f}%')
cv2.putText(warped,str(score)+'%',(10,30),cv2.FONT_HERSHEY_SIMPLEX,0.9,(0,0,255),2)
cv_show('result',warped)

运行结果:

答题卡原图,如图18.1所示:

18.1-答题卡原图

答题卡原图去噪点,如图18.2所示:

18.2-答题卡原图去噪点

答题卡边缘检测,如图18.3所示:

18.3-答题卡边缘检测

答题卡边缘绘制,如图18.4所示:

18.4-答题卡边缘绘制

答题卡透视变换,如图18.5所示:

18.5-题卡透视变换

答题卡透视变换后二值化,如图18.6所示:

18.6-答题卡透视变换后二值化

答题卡二值化后找到圆圈轮廓,如图18.7所示:

18.7-答题卡二值化后找到圆圈轮廓

得到matplotlib图以确定圆圈的大小,如图18.8所示:

18.8-得到matplotlib图以确定圆圈的大小

对答案得到最终结果分数,如图18.9所示:

18。9-对答案得到最终结果分数

(二)文档ocr扫描识别

思路:

  • 1.图片预处理
  • 2.透视变换,视角拉正
  • 3.tesseract进行识别
import cv2
import numpy as np
import matplotlib.pyplot as plt
import pytesseract
from PIL import Image
#封装显示图片的函数
def cv_show(name,img):
    cv2.imshow(name, img) 
    cv2.waitKey(0)  
    cv2.destroyAllWindows()
#读取图片
image=cv2.imread('./paper01.png')
#计算比例,限定高度500
image.shape
ratio=image.shape[0]/500.0
orig=image.copy()

#对图片进行统一的resize
#封装resize功能
def resize(image,width=None,height=None,inter=cv2.INTER_AREA):
    dim=None
    (h,w)=image.shape[:2]
    if width is None and height is None:
        return image
    #指定了resiaze的height
    if width is None:
        r=height/float(h)
        dim=(int(w*r),height)
    #指定了resize的width
    else:
        r=width/float(w)
        dim=(width,int(h*r))
    resized=cv2.resize(image,dim,interpolation=inter)
    return resized

#对图片进行resize
image=resize(orig,height=500)

image.shape

#图片预处理
#灰度化处理
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#高斯平滑
gray=cv2.GaussianBlur(gray,(5,5),0)
#边缘检测
edged=cv2.Canny(gray,75,200)

cv_show('edged',edged)

#轮廓检测
cnts=cv2.findContours(edged.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)[1]
#按照面积排序
cnts=sorted(cnts,key=cv2.contourArea,reverse=True)
# cnts


image_contours=cv2.drawContours(image.copy(),cnts,-1,(0,0,255),2)
cv_show('image_contours',image_contours)

#遍历轮廓找到最大的轮廓
for c in cnts:
    #计算轮廓周长
    perimeter=cv2.arcLength(c,True)
    #多边形逼近
    approx=cv2.approxPolyDP(c,0.02*perimeter,True)

    if len(approx)==4:
        screen_cnt=approx
        break

image_contours=cv2.drawContours(image.copy(),[screen_cnt],-1,(0,0,255),2)
cv_show('image_contours',image_contours)


#进行透视变换
#透视变换要找到变换矩阵
#变换矩阵要求原图的四个点的点坐标和变换之后的四个点坐标
#现在已经找到了原图的四个点的坐标,需要找到变换后四个点的坐标
#先对获取到的4个角点坐标按照一定的顺序排序(顺时针或逆时针)
#排序功能是一个独立功能,可以封装成一个函数
def order_points(pts):
    #创建全是0的矩阵,来接收等下找出来的四个角的坐标
    rect=np.zeros((4,2),dtype='float32')
    s=pts.sum(axis=1)
    #左上x+y最小,右下x+y最大
    rect[0]=pts[np.argmin(s)]
    rect[2]=pts[np.argmax(s)]

    #右上角x-y最小,左下角x-y最大
    diff=np.diff(pts,axis=1)
    rect[1]=pts[np.argmin(diff)]
    rect[3]=pts[np.argmax(diff)]
    return rect

#把透视变换功能封装成一个函数
def four_point_transform(image,pts):
    #对输入的四个坐标排序
    rect=order_points(pts)
    (tl,tr,br,bl)=rect

    #空间中两点的距离
    widthA=np.sqrt((br[0]-bl[0])**2+(br[1]-bl[1])**2)
    widthB=np.sqrt((tr[0]-tl[0])**2+(tr[1]-tl[1])**2)
    max_width=max(int(widthA),int(widthB))

    heightA=np.sqrt((tr[0]-br[0])**2+(tr[1]-br[1])**2)
    heightB=np.sqrt((tl[0]-bl[0])**2+(tl[1]-bl[1])**2)
    max_height=max(int(heightA),int(heightB))
    #构造变换之后的对应坐标位置
    dst=np.array([
        [0,0],
        [max_width-1,0],
        [max_width-1,max_height-1],
        [0,max_height-1]
    ],dtype='float32')

    #计算变换矩阵
    M=cv2.getPerspectiveTransform(rect,dst)
    #透视变换
    warped=cv2.warpPerspective(image,M,(max_width,max_height))
    return warped


warped=four_point_transform(orig,screen_cnt.reshape(4,2)*ratio)
warped.shape

cv_show('warped',warped)


#二值处理
warped=cv2.cvtColor(warped,cv2.COLOR_BGR2GRAY)
ref=cv2.threshold(warped,100,255,cv2.THRESH_BINARY)[1]
cv_show('ref',ref)

#把处理好的图片写入图片文件
cv2.imwrite('./scan.jpg',ref)

#pytesseract要求的image不是openCV读进来的image,而是pillow这个包,即PIL,按照pip install pillow
text=pytesseract.image_to_string(Image.open('./scan.jpg'))
print(text)

运行结果:

小票原图,如图18.10所示:

18.10-小票原图

边缘检测结果,如图18.11所示:

18.11-边缘检测结果

轮廓检测结果,如图18.12所示:

18.12-轮廓检测结果

多边形逼近结果,如图18.13所示:

18.13-多边形逼近结果

透视变换结果,如图18.14所示:

18.14-透视变换结果

二值化处理结果,如图18.15所示:

18.15-二值化处理结果

最终读出的文本(无高清图,只读出标题):

WHOLE

FOODS

Lt g
Palantir Vertex:数字孪生模拟与决策系统深度指南 Palantir Vertex是Foundry系统中的核心数字孪生模块,本质上是一个决策模拟器而非简单的数据可视化工具。它基于本体层构建,通过对象关系网络模拟现实世界实体,填补数据模型与业务决策间的鸿沟。核心功能包括:创建隔离的沙盒场景进行假设测试、修改参数模拟不同干预方案、对比虚实数据发现异常,并最终将最优决策回传至业务系统。典型应用场景涵盖供应链韧性评估、资产维护优化和应急方案制定等,帮助用户在复杂环境中做出更优决策。 阅读详情

相关推荐

【计算机三级-数据库技术】操作题大题(第1套)

从触发器的语法中可知,【1】处应该填写的是执行触发器的表,【2】处应该填写指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。使用FOR或AFTER选顶定义的触发器为后触发器,即只有在引发触发器执行的语句中的操作都已成功执行,并且所有的约束检查也成功完成后,才执行触发器。转换成新的独立的模式,模式的属性由联系本身的属性及两个实体的键构成,主键由两端实体的键组合而成。实体的转换:在从ER图转换为关系模式时,一个实体转换成一个关系模式,实体的属性就是关系模式的属性,实体的键就是关系的主键。

放纵小开爱的博客 1101

OpenCV Python 入门学习笔记(小白版)

本文为OpenCV Python入门学习笔记,涵盖从环境配置到基础操作的11个核心知识点。重点讲解图片作为数字矩阵的存储原理、BGR颜色通道、坐标系统((x,y)与[y,x]区别)、图像读取与显示、色彩分离、灰度转换、裁剪、绘图、滤波、边缘检测、二值化及形态学操作。通过实战代码演示,强调“运行+修改参数”的学习方法,帮助新手快速掌握图像处理基础,避免路径错误、颜色混淆等常见陷阱。适合零基础者循序渐进上手。

敲代码的乔帮主 225

基于C#的软PLC梯形图编辑器开发实战

本文详细介绍了基于C#开发软PLC梯形图编辑器的实战过程。文章从核心数据结构设计入手,阐述了如何利用C#的面向对象特性构建梯形图元素模型,并实现了图形编辑、指令表输入、逻辑连接拓扑重建等关键功能。重点剖析了模拟PLC执行引擎的扫描周期与能流传递算法,让梯形图逻辑在PC上“活”起来。最后探讨了定时器指令实现、性能优化及项目集成等进阶内容,为工业自动化软件集成提供了灵活高效的解决方案。

weixin_28314575的博客 404

OpenCV 入门(五):视频处理与拖动条

本文介绍OpenCV视频处理基础,核心观点:视频即每秒30帧的Mat图像序列。通过VideoCapture捕获摄像头数据,循环读取frame(本质为Mat),可复用所有图像处理操作。关键要点包括:必须检查isOpened()、使用waitKey(1)维持流畅画面、变量声明在循环外以避免重复内存分配。结合拖动条实现阈值参数实时调节,支持Otsu自动调参。强调常见坑点:勿用waitKey(0)、变量需全局声明、窗口名禁用中文。最后指出帧率由采集与处理耗时共同决定,无专用视频API。

qq_35803412的博客 205

Python大数据舆情分析系统开发实战

舆情监测系统是大数据分析的重要应用场景,通过自然语言处理(NLP)技术解析社交媒体文本情感倾向。基于Python技术栈的解决方案整合了Scrapy爬虫框架进行数据采集,PySpark处理海量文本数据,结合SnowNLP和Jieba实现中文语义分析。系统采用微服务架构设计,包含数据采集层、处理层、存储层和应用层,通过情感分析优化和实时热点检测算法提升监测准确率。典型应用包括企业品牌监测、公共事件预警等场景,开发过程中需特别注意数据合规性和分布式集群的性能调优。

weixin_34408624的博客 387

一文介绍Linux EAS

EAS只在系统负载不重时,即系统中每个CPU的利用率都低于其算力的80%时才被启用,而且选出的最节能CPU只有比线程当前运行的CPU节约能量大于6%时,线程才会迁移到该CPU运行。因此EAS为线程选择最节约能量的CPU来运行的前提条件是很苛刻的,针对重载场景(比如游戏),EAS的功能应该很少被使用起来,针对重载场景的功耗优化,这里可能是一个值得尝试的点。算力(capacity)是CPU调度中的一个基础概念,它反映的是一个CPU的计算能力,是个规格化的值,可以通过读取Android手机的文件节点。

youzhangjing_的博客 1234

OpenCV 高级 001-图像修复

如果背景图与涂鸦颜色相差较大就需要使用 cv2.THRESH_TOZERO_INV。黑色(像素值较小)涂鸦 用 THRESH_TOZERO_INV 效果较好。像素值较大 涂鸦 用 THRESH_BINARY 效果较好。

Rainbow 193

GeoServer下载与安装(详细图文教程)

GeoServer官方版可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间地理信息。

大剑师兰特的GIS世界 3276

OpenCV 从零入门(Python 版)

本文为 OpenCV Python 入门教程,面向零基础用户,涵盖图像读取、显示、写入、缩放、裁剪、平移旋转、标注、颜色空间、滤波、阈值分割、边缘检测、轮廓识别、视频处理及深度学习应用。内容基于 15 课体系,强调实战代码与常见坑点,核心概念包括图像即像素数组、坐标原点在左上角、BGR 颜色顺序,以及 cv2.imread 返回 None 的隐患。建议按序学习,掌握 cv2.imshow 与 waitKey 配合使用,熟练运用 NumPy 数组操作图像,快速上手计算机视觉基础技能。

敲代码的乔帮主 197

Vue3 - 详解实现网站接入钉钉扫码登录功能,钉钉授权生成登录二维码用户用手机扫描二维码登陆,支持弹框式、浏览器单独新开页显示,钉钉扫描二维码登录详细流程及示例代码,最新vue集成钉钉扫码授权登录!

vue3,nuxt3,钉钉,扫码登录,vue3钉钉扫码登陆,钉钉授权第三方WEB网站扫码登录功能,钉钉扫码登录第三方网站,单点登录,二维码不显示,报错,扫了没反应,出错,vue3钉钉扫码登录,内嵌,获取个人信息,pc网页钉钉登录,钉钉扫码登录怎么新开一页,跳页显示二维码,内嵌登录二维码,iframe新页面弹出,弹出一个小窗口显示登录二维码,登录报错,扫码没反应,解决手机点登录报错没反应,官方文档,手机扫描钉钉二维码登录网站,页面弹出一个小窗口而不是打开一个页面,vue3中使用iframe实现另开小窗口扫码登

🏆 前端领域优质创作者 3695

康复训练监测系统:基于YOLOv8的患者动作规范识别

本文系统介绍了基于YOLOv8的康复训练动作规范识别系统,从理论背景、数据准备、模型训练、推理应用到UI界面,提供了完整技术链条及代码示范。希望对康复领域的智能监测应用提供参考和借鉴。

YOLO 453

ffmpeg学习4:opencv在音视频领域常用指令

核心流程:视频/图像读写 → 帧预处理 → 特征提取或模型推理 → 视频分析 → 结果输出videoioimgproccorevideodnnfeatures2dvideodnnimgcodecsvideoio。

2501_90216642的博客 216

海康VisionMaster与西门子PLC1200进行S7通信

通信是连通算法平台和外部设备的重要渠道,在海康VisionMaster算法平台中既支持外部数据的读入也支持数据的写出,当通信构建起来以后既可以把软件处理结果发送给外界,又可以通过外界发送字符来触发相机拍照或者软件运行。 本文以西门子PLC1200作为外部设备为例,讲解海康VisionMaster与西门子PLC1200进行S7通信。......

haier123888的博客 1万+

OpenCV 5.1.0正式发布:核心矩阵、图像处理、DNN推理全面升级,性能与稳定性大幅增强

与此同时,OpenCV 5.1.0 还在 AVX-512、NEON、RISC-V RVV、IPP、OpenCL、CUDA、ArmPL 等多个后端持续优化,并对大量精度、内存、越界、异常输入和跨平台问题进行了修复。DNN 模块则完成新引擎统一,强化了 CUDA、cuDNN JIT、ONNX、TFLite、注意力机制、KV 缓存和量化推理能力。另一方面在 SIMD、AVX-512、RISC-V RVV、CUDA、OpenCL、IPP、ArmPL 等后端上进行了大量性能优化。DNN 模块迎来重要架构调整。

福大大架构师每日一题 695

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

OpenCv 卷积核基础概念 以及 图像滤波 与 边缘检测

目前也可以通过多个小卷积核,来实现大卷积的效果,且减轻负担。2、当卷积i有标准方式进行边界扩充,则输出数据的空间尺寸将于输入相等。影响:卷积核越大,看到的信息就越多,提取的特征就越好,计算量增大,它允许你用一个自己设计的“小矩阵”(即卷积核)在整张图片上滑动,通过数学计算来改变像素值,从而实现。除了可以像均值滤波一样取平均值,它还多了一个控制开关,可以。将中心像素周围的所有像素取平均值,赋给中心像素。它能有效去除图像中的噪点,但会。其中滤波器又称为卷积核,滤波的过程(乘法后)称为卷积;

ahccqw的博客 203

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C#使用opencv和Yolo模型识别车牌号

本文基于OpenCVSharp与OnnxRuntime,结合YoloV8n-pose_plate模型(检测车牌位置)和OCR模型(识别车牌文字),实现高效车牌识别。通过预处理、目标检测、NMS筛选及文字识别流程,最终输出车牌框位置与识别文本。代码封装良好,支持自定义路径与置信度阈值,具备实际应用价值。

lweiyue的专栏 174

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ffmpeg学习3:opencv使用vs资源文件

双击rc文件,打开资源视图窗口。

2501_90216642的博客 65

基于YOLO与OpenCV的无人机识别及电子围栏告警实现思路

无人机检测只是低空安全管理的第一步。从发现目标,到区分无人机与飞鸟,再到目标跟踪、位置关联、电子围栏校验和事件处置,每一个环节都需要有明确的技术输入和业务输出。对于低空安全项目建设而言,真正需要关注的不是简单增加几个摄像头或部署一个识别模型,而是不同感知设备、算法能力和管理平台能否形成有效协同。围绕低空安全应用,相关建设可以将AI视觉识别、边缘计算、多源感知和业务平台结合起来,逐步形成目标发现、异常告警、辅助研判和事件留痕的管理链路。让AI负责发现,让数据辅助研判,让管理流程完成处置。

荆棘鸟智能的博客 228

C# 基于OpenCv的视觉工作流-章117-TCP/ModbusTcp/Http消息回发

本章基于C#与OpenCv,实现TCP/IP、ModbusTcp及Http通讯的优化,构建视觉检测闭环流程:通过触发信号启动检测,执行完成后自动将结果(OK/NG)回传至客户端。支持海康相机、PC相机图像/视频采集,新增多条件判定、车辆统计、区域警报等15项功能。配套免费工具“VisionTool 探迹”已更新,提供完整视觉工作流解决方案。

sali-tec的博客 136

【Linux】RK3568-OpenCV+YOLO(八)

1

Longrun的博客 306

使用PaddleOCR和OpenCV5实现OCR

本文介绍在OpenCV 5环境下绕过依赖限制,直接使用OpenCVSharp与OnnxRuntime调用PaddleOCRv5模型实现文字检测与识别的方法。通过加载det.onnx(检测)和rec.onnx(识别)模型,结合ppocrv5_dict.txt字典,实现了对证件类图像的高精度文字识别,识别结果包含文本内容及置信度,效果良好,适用于多场景OCR应用。

lweiyue的专栏 195

opencv的jar安装到本地库中打包

maven无法下载opencv,需要下载org.opencv的jar。

xiangshanqishi的专栏 50

OpenCV Python cv2 常用接口速查表

OpenCV Python cv2 常用接口速查表

m0_54342116的博客 319

OpenCV 车辆数量统计

涉及到的知识点:1)基本图像运算与处理2)形态学3)轮廓查找4)加载视频5)通过形态学识别车辆6)对车辆进行统计7)显示车辆统计信息。

ahccqw的博客 45

C# 基于OpenCv的视觉工作流-章116-多节点条件

本章介绍C#基于OpenCv的多节点条件视觉工作流,重点实现多源检测结果的综合判定。通过配置各节点判定条件,系统自动判断所有条件满足时输出OK/NG结果,逻辑关系为“与”;支持图像与字体显示设置。工具更新新增海康、PC相机采集及多种通讯优化功能,提升检测效率与兼容性。欢迎继续阅读后续章节。

sali-tec的博客 177

OpenCV 4.14.0 Windows x64编译依赖包:IPPICV、FFmpeg与ADE

面向OpenCV 4.14.0 Windows x64/MSVC源码构建,列明IPPICV、FFmpeg、ADE五项依赖、校验及缓存准备方法,并说明适用范围。

Starry-SkyJing的博客 268
上一篇: 【OpenCV】(十七)目标追踪
下一篇: 【OpenCV】(十九)光流估计
Cccp.123
博客等级 码龄3年 5粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值