机甲大师:矩形框选(23/4/23已更新)

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

机甲大师:矩形框选算法(23/4/23已更新)

2023/4/17:由于大创的关系,我把这个算法整合进新项目中,所以同时修复了代码中的一些问题,比如全局对象问题,当然挺多没改的(代码是大一写的,现在看看真的是屎。)

效果如图:

请添加图片描述

——————————————————分割线—————————————————

本项目是一个基于Opencv与C++的项目,主要实现了装甲板灯条的识别,并用矩形动态框选

本项目是我RM视觉初学者时,结合队友的项目基础,一点点磨出来的,算是一个优化版本。

PS:这个版本矩形框不会跳动,很稳定,我优化了很久,但视频帧率有点低

整个项目我在初学时都标注了详尽的注释,可谓花了很多功夫。希望能帮到各位有需要的人吧。

个人额外提醒:注意项目中的 功能4:斜矩形框选 ,那个是优化的精髓。我研究了很久,可能是我当时Opencv基础较差的原因,可以让矩形框选保持稳定。

项目配置:

采用Opecv4以上版本:

#include <iostream>
#include<vector>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui_c.h>
#include<imgproc/imgproc.hpp>
#include<core/core.hpp>
using namespace std;
using namespace cv;
 
 
class rec_recognition
{
public:
    int match_num;
    vector<RotatedRect>rect_match;
    vector<Point3i>level_end;

    Mat src;
    Mat src_end, dst;
    Mat GrayImg;
    Mat BinBrightImg;
    Mat BinGrayImg;
    Mat final;
 
    double max(double first, double secend);
    double min(double first, double secend);
 
    void pre_treatment();
    void application();
    int match();

private:
    int index = 0, maxlevel = 0;
    RotatedRect rect, leftrect, rightrect;
    Rect rect_first;
    Point2f currentCenter;
    double area[2];
    double height = (leftrect.size.height + rightrect.size.height) / 2;
};

 
int main(){
    VideoCapture capture("/Users/nathanchen/Downloads/rec_recognition/rectangle.mp4"); //这里输入文件
    
    rec_recognition apply;
    
    while (1){
        
        capture >> apply.src;
 
        apply.pre_treatment();
 
        apply.match();
 
        if (apply.match_num == 1){ //如果match处匹配成功,那就返回1
            apply.application();
            //imshow("rec_recognition", apply.src_end);
            imshow("rec_recognition1", apply.src);
        }
 
        apply.rect_match.clear();

        apply.level_end.clear();
 
        waitKey(1000 / capture.get(CAP_PROP_FPS)); //每隔多少秒读下一帧
    }
    return 0;
}
 
void rec_recognition::pre_treatment(){
 
    //色彩通道处理
    std::vector<Mat> channels;// 把一个3通道图像转换成3个单通道图像
    split(src, channels);//分离色彩通道
 
    //只留蓝色(可以修改成其他颜色)——————————————————————————————————————修改颜色
    GrayImg = channels.at(0) - channels.at(2);
 
    //阈值处理
    threshold(GrayImg, BinBrightImg, 55, 255, THRESH_BINARY);
    threshold(GrayImg, BinGrayImg, 25, 255, THRESH_BINARY);
 
    //形态学操作(膨胀)
    Mat element_d = getStructuringElement(MORPH_ELLIPSE, Size(2, 2));//形态学操作
    dilate(BinBrightImg, BinBrightImg, element_d);//膨胀
 
    //与操作(?????)
    BinBrightImg &= BinGrayImg;
 
    //形态学操作(膨胀与腐蚀)
    Mat element_d0 = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
    Mat element_e0 = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
 
    //再次腐蚀膨胀,为了让线条更连贯
    dilate(BinBrightImg, BinBrightImg, element_d0);
    erode(BinBrightImg, final, element_e0);
 
 
    //--------------------------寻找矩形框架---------------------------------//
 
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    Point2f vertex[4];
 
    findContours(final, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0, 0));
 
    //筛选矩形
    for (int i = 0; i < hierarchy.size(); ++i)
    {
        rect = minAreaRect(contours.at(i));
        if (rect.size.width > rect.size.height)
        {
            swap(rect.size.width, rect.size.height);
            rect.angle += 90.0;
        }
        while (rect.angle >= 90.0)rect.angle -= 180.0;
        while (rect.angle <= -90.0)rect.angle += 180.0;
        if (rect.size.width * rect.size.height < 1000)
        {
            if (rect.size.width < rect.size.height / 2.5)
            {
                if (rect.angle < 45 || rect.angle>135)
                {
                    rect_match.push_back(rect);  //将匹配好的矩形放入数组(rect_match)中
                }
            }
        }
 
        //测试:矩形框选灯条
        /*rect_first = boundingRect(contours.at(i));
         if (rect_first.width < rect_first.height)
         {
             rectangle(src, rect_first, Scalar(255, 0, 255), 2, LINE_8);
         }*/
 
    }
    cout << rect_match.size() << endl;
 
    //清空数组,防止内存泄漏
    contours.clear();
    hierarchy.clear();
 
    //imshow("Shlimazl1", final);
}
 
int rec_recognition::match(){
    int level = 0;
 
    if (rect_match.size() < 2){
        return match_num = 0;
    }else{
        for (int j = 0; j < rect_match.size(); ++j){
            for (int k = j + 1; k < rect_match.size(); ++k){
                int level = 0;

                leftrect = rect_match[j];
                rightrect = rect_match[k];

                //左右矩形高匹配
                if ((min(leftrect.size.height, rightrect.size.height) / max(leftrect.size.height, rightrect.size.height)) == 1)
                {
                    level += 10;
                }
                else if ((min(leftrect.size.height, rightrect.size.height) / max(leftrect.size.height, rightrect.size.height)) > 0.95)
                {
                    level += 8;
                }
                else if ((min(leftrect.size.height, rightrect.size.height) / max(leftrect.size.height, rightrect.size.height)) > 0.9)
                {
                    level += 6;
                }
                else if ((min(leftrect.size.height, rightrect.size.height) / max(leftrect.size.height, rightrect.size.height)) > 0.85)
                {
                    level += 4;
                }
                else if ((min(leftrect.size.height, rightrect.size.height) / max(leftrect.size.height, rightrect.size.height)) > 0.8)
                {
                    level += 2;
                }
 
                //左右矩形角度匹配
                if (leftrect.angle == rightrect.angle)
                {
                    level += 10;
                }
                else if (abs(leftrect.angle - rightrect.angle) < 4)
                {
                    level += 8;
                }
                else if (abs(leftrect.angle - rightrect.angle) < 8)
                {
                    level += 6;
                }
                else if (abs(leftrect.angle - rightrect.angle) < 12)
                {
                    level += 4;
                }
                else if (abs(leftrect.angle - rightrect.angle) < 16)
                {
                    level += 2;
                }
 
 
                //左右矩形面积匹配
                area[0] = leftrect.size.width * leftrect.size.height;
                area[1] = rightrect.size.width * rightrect.size.height;
 
                if (area[0] == area[1])
                {
                    level += 10;
                }
                else if (min(area[0], area[1]) * 1.2 > max(area[0], area[1]))
                {
                    level += 8;
                }
                else if (min(area[0], area[1]) * 1.5 > max(area[0], area[1]))
                {
                    level += 6;
                }
                else if (min(area[0], area[1]) * 1.8 > max(area[0], area[1]))
                {
                    level += 4;
                }
                else if (min(area[0], area[1]) * 2.1 > max(area[0], area[1]))
                {
                    level += 2;
                }
 
 
                //左右矩形中心的y值匹配
                if (leftrect.center.y == rightrect.center.y)
                {
                    level += 10;
                }
                else if (abs(leftrect.center.y - rightrect.center.y) < 0.05 * height)
                {
                    level += 8;
                }
                else if (abs(leftrect.center.y - rightrect.center.y) < 0.1 * height)
                {
                    level += 6;
                }
                else if (abs(leftrect.center.y - rightrect.center.y) < 0.15 * height)
                {
                    level += 4;
                }
                else if (abs(leftrect.center.y - rightrect.center.y) < 0.2 * height)
                {
                    level += 2;
                }
 
 
                //左右矩形中心的x值匹配
                if ((abs(leftrect.center.x - rightrect.center.x) / 2.5 * height) == 1)
                {
                    level += 10;
                }
                else if (1 > (abs(leftrect.center.x - rightrect.center.x) / 2.5 * height) > 0.9)
                {
                    level += 8;
                }
                else if (0.9 > (abs(leftrect.center.x - rightrect.center.x) / 2.5 * height) > 0.8)
                {
                    level += 6;
                }
                else if (0.8 > (abs(leftrect.center.x - rightrect.center.x) / 2.5 * height) > 0.7)
                {
                    level += 4;
                }
                else if (0.7 > (abs(leftrect.center.x - rightrect.center.x) / 2.5 * height) > 0.6)
                {
                    level += 2;
                }
 
                level_end.push_back(Point3i(j, k, level));   //level_end 为一个数组 , 为什么要用3D坐标系???秀技???
 
            }
        }
 
        //level 的比较
        int maxlevel = 0;
 
        for (int C = 0; C < level_end.size(); ++C)
        {
            if (level_end[C].z > maxlevel)
            {
                maxlevel = level_end[C].z;
                index = C;
            }
        }
 
        // rect_match[level_end[index]
 
 
        //首先我们筛选出优质的矩形对,这里面包含(左矩形的标号,右矩形的标号,权值),这里是一个三元数组,x为左矩形,y为右
 
 
        //输出中心点坐标
        currentCenter.x = (rect_match[level_end[index].x].center.x + rect_match[level_end[index].y].center.x) / 2;
        currentCenter.y = (rect_match[level_end[index].x].center.y + rect_match[level_end[index].y].center.y) / 2;
 
        //return currentCenter, rect_match[level_end[index].x].center, rect_match[level_end[index].y].center;
        return match_num = 1;
 
    }
}
 
void rec_recognition::application()
{
    Point2f points1[4];
    Point2f points2[4];
 
    Point2f Leftc;
    Point2f Rightc;
 
    //注意:在视频中,左右矩形会交换
 
    rect_match[level_end[index].y].points(points2);
    rect_match[level_end[index].x].points(points1);
 
    Leftc = rect_match[level_end[index].x].center;
    Rightc = rect_match[level_end[index].y].center;
 
 
 
 
    //功能1:输出中心点坐标
    //cout << "//*********************************************" << endl;
 
    //cout << "(" << Leftc.x << "," << Leftc.y << ")" << endl;
 
    //cout << "(" << Rightc.x << "," << Rightc.y << ")" << endl;
 
    //cout << "*********************************************//" << endl;
 
     //功能2:画出中心点
    //点型
    //circle(apply.src, currentCenter, 2, Scalar(0, 0, 255), 2, 8, 0);
    //十字型
    line(src, Point(currentCenter.x - 5, currentCenter.y), Point(currentCenter.x + 5, currentCenter.y), Scalar(0, 0, 255), 2, 8, 0);
    line(src, Point(currentCenter.x, currentCenter.y - 5), Point(currentCenter.x, currentCenter.y + 5), Scalar(0, 0, 255), 2, 8, 0);
 
 
    //功能3:正矩形框选
   /* line(apply.src, Point(currentCenter.x + (Leftc.x - Rightc.x) / 2, currentCenter.y - (Leftc.x - Rightc.x) / 4),
        Point(currentCenter.x - (Leftc.x - Rightc.x) / 2, currentCenter.y - (Leftc.x - Rightc.x) / 4), Scalar(0, 0, 255), 2, 8);
    line(apply.src, Point(currentCenter.x + (Leftc.x - Rightc.x) / 2, currentCenter.y + (Leftc.x - Rightc.x) / 4),
        Point(currentCenter.x + (Leftc.x - Rightc.x) / 2, currentCenter.y - (Leftc.x - Rightc.x) / 4), Scalar(0, 0, 255), 2, LINE_8);
    line(apply.src, Point(currentCenter.x - (Leftc.x - Rightc.x) / 2, currentCenter.y + (Leftc.x - Rightc.x) / 4),
        Point(currentCenter.x - (Leftc.x - Rightc.x) / 2, currentCenter.y - (Leftc.x - Rightc.x) / 4), Scalar(0, 0, 255), 2, 8);
    line(apply.src, Point(currentCenter.x + (Leftc.x - Rightc.x) / 2, currentCenter.y + (Leftc.x - Rightc.x) / 4),
        Point(currentCenter.x - (Leftc.x - Rightc.x) / 2, currentCenter.y + (Leftc.x - Rightc.x) / 4),
        Scalar(0, 0, 255), 2, 8);*/
 
 
        //功能4:斜矩形框选
 
        //一开始points1[0]在右矩形,然后过一段时间它会跳到左边
 
 
    if (points2[0].x <= points1[0].x) {
 
        //矩形的长
        line(src, points1[2], points2[1], Scalar(0, 0, 255), 2, 8, 0);
        line(src, points1[3], points2[0], Scalar(0, 0, 255), 2, 8, 0);
 
        //矩形的宽
        line(src, points1[2], points1[3], Scalar(0, 0, 255), 2, 8, 0);
        line(src, points2[1], points2[0], Scalar(0, 0, 255), 2, 8, 0);
    }
    else if (points2[0].x > points1[0].x) {
 
        //矩形的长
        line(src, points1[0], points2[3], Scalar(0, 0, 255), 2, 8, 0);
        line(src, points1[1], points2[2], Scalar(0, 0, 255), 2, 8, 0);
 
        //矩形的宽
        line(src, points1[0], points1[1], Scalar(0, 0, 255), 2, 8, 0);
        line(src, points2[2], points2[3], Scalar(0, 0, 255), 2, 8, 0);
 
    }
 
 
 
    //test(点测试)
   /* circle(apply.src, points1[0], 2, Scalar(0, 0, 255), 2, 8, 0);
    circle(apply.src, points1[1], 2, Scalar(0, 0, 255), 2, 8, 0);
    circle(apply.src, points2[0], 2, Scalar(255, 0, 0), 2, 8, 0);
    circle(apply.src, points2[1], 2, Scalar(255, 0, 0), 2, 8, 0);*/
 
 
 
    //下一步的操作:
 
    //预测:重力加速度,重力为g,
 
    //做好预测
 
}
 

double rec_recognition::max(double first, double second){
    return first > second ? first : second;
}
 
double rec_recognition::min(double first, double second){
    return first < second ? first : second;
}
基于知识图谱的电影推荐系统——Neo4j&Python 也可直接从这里下载:链接: https://pan.baidu.com/s/1l6wjwcUzy5G_dIlVDbCkpw 提取码: pkq6。修改main.py中的driver,输入自己数据库的用户名与密码。系统会询问是否需要重新加载并创建知识图谱,在第一次时输入1。 阅读详情

相关推荐

HDMI2.1 FRL流控 概览

HDMI 2.1 FRL的流控本质是。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 2083

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

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

敲代码的乔帮主 229

保姆级教程:在Win10/Win11上搞定AppScan 10.0.0安装与许可证激活(含常见报错解决)

本文提供AppScan 10.0.0在Win10/Win11上的详细安装与许可证激活指南,涵盖环境准备、分步安装、文件替换技巧及常见报错解决方案。通过专业的安全测试工具部署实践,帮助用户高效完成安装并避免常见陷阱,提升Web应用安全扫描效率。

weixin_30800987的博客 425

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

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

qq_35803412的博客 209

74.9008深度刷机原理|高通QPST/Firehose底层刷写协议详解

移动设备刷机与底层维修技术指南 本文为移动设备维修人员和高级玩家提供全面的刷机与底层维修技术指南,涵盖高通、联发科和苹果A系列芯片的主要操作。 主要内容 核心操作:Bootloader解锁、Fastboot刷写、EDL深度修复、iTunes DFU模式恢复和分区表重建 适用场景:系统故障修复、底层损坏恢复、安全限制解除、系统降级和深度硬件维修 关键技术:详细解析刷机协议栈层级、关键分区作用和刷机安全机制 操作步骤: 环境搭建与驱动安装 Bootloader解锁(以小米为例) 高通机型系统刷写 苹果设备DFU

2601_95651806的博客 205

模拟一个基站和一个移动台之间的信号传播

同样使用时间序列和上述参数计算出反射径信号的信号强度。根据时间序列和上述参数,计算出直射径信号的信号强度。该信号被视为一个简单的正弦波信号,其频率是2Hz。:时间序列,从0.1秒开始,每隔0.0001秒采样一次,直到12秒。:设置坐标轴范围,横轴范围为0到12秒,纵轴范围为-0.5到0.5。:移动台移动的速度。:移动台距离基站的初始距离。:基站到反射墙的距离。假设基站到反射墙的距离为15米。:绘制直射径信号、反射径信号和合成信号的波形图。:添加标签,标注每条曲线对应的含义。表示反射径信号的颜色为绿色,

Fanjufei的博客 292

OpenCV 高级 001-图像修复

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

Rainbow 195

STM32G0/G4电机控制中三角函数与浮点运算优化实战

三角函数(sin/cos)和浮点运算是电机矢量控制(FOC)的核心基础,直接影响Clark/Park变换、SVPWM及观测器的实时性与精度。在资源受限的MCU上,标准math.h库因无硬件FPU支持而引发严重时序抖动,导致电流环延迟、转矩脉动增大甚至系统复位。通过硬件加速(如STM32G4的CORDIC协处理器)或定制化定点算法(如STM32G0的查表+线性插值),可将sin/cos计算从数十微秒压缩至1–3 μs量级,提升30倍以上效率。该方案广泛适用于BLDC/PMSM驱动、伺服控制及高动态响应嵌入式运

weixin_35751412的博客 110

OpenCV 从零入门(Python 版)

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

敲代码的乔帮主 203

R数据分析:潜在转化分析LTA的做法和解释(一)

之前给大家写了很多潜在类别分析的教程Mplus教程:如何做潜在类别分析LCAR数据分析:用R语言做潜类别分析LCAMplus数据分析:潜在类别分析(LCA)流程(详细版)R数据分析:再写潜在类别分析LCA的做法与解释,今天继续给大家拓展一步。 今天要介绍的就是潜在转换分析,这个东西就是LCA的纵向版本。是一个专门用来研究质变的统计技巧。有一句话叫做量变起质变,你怎么知道质变到底发生没有?就用潜在转换分析。 Latent transition analysis is an extension of...

Codewar的博客 7703

自然语言处理NLP星空智能对话机器人系列:Gavin大咖 Transformer 101问答集 第一问

自然语言处理NLP星空智能对话机器人系列:Transformer 101问答 [让天下没有难学的Transformer] 你问我答系列之一 Gavin大咖第一问: Transformer中的可训练Queries、Keys和Values矩阵从哪儿来? 以上是智华解答,供同学们参考。 星空智能对话机器人系列博客 NLP星空智能对话机器人系列:第二次星空智能对话机器人Zoom线上演示安排 NLP星空智能对话机器人系列:StarSpace: Embed All The Things NLP星空智能对

大模型与Agent智能体 991

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

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

2501_90216642的博客 227

使用Gitlab 搭建私有镜像仓库(外置Nginx)

为了让团队尽快使用Gitlab的CI进行工作,必须做好Gitlab的初始化工作,大家都知道拉取镜像由于某些原因,会比较慢,因此构建自己的私有镜像仓库就成为了关键的一步。当然私有镜像仓库的搭建有很多种方式,这里直接使用Gitlab提供的镜像仓库功能。一揽子解决方案比较香。gitlab真的越来越好用了,有了这个镜像仓,也没必要再使用三方的镜像仓库了。Devops 真好用!

网尘的技术专栏 1829

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

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

lweiyue的专栏 182

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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 模块迎来重要架构调整。

福大大架构师每日一题 722

深度学习工具包 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")

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

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

ahccqw的博客 208

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

2501_90216642的博客 68

【Linux】RK3568-OpenCV+YOLO(八)

1

Longrun的博客 334

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

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

sali-tec的博客 146

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

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

xiangshanqishi的专栏 69

使用PaddleOCR和OpenCV5实现OCR

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

lweiyue的专栏 202

OpenCV Python cv2 常用接口速查表

OpenCV Python cv2 常用接口速查表

m0_54342116的博客 351

OpenCV 车辆数量统计

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

ahccqw的博客 82

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

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

Starry-SkyJing的博客 272

OpenCV 入门(四):阈值二值化与 Otsu

本文介绍OpenCV中阈值二值化与Otsu自动阈值算法。通过将灰度图像转换为纯黑白二值图,实现像素“要”或“不要”的分类,为轮廓检测、形态学操作等任务奠定基础。重点讲解threshold函数的五种比较方式,强调阈值方向(阈值越低白越多)及位标志|的用法。引入Otsu算法自动计算最优阈值,适用于目标与背景亮度差异明显的场景。指出常见误区:阈值固定、误用彩色图、过度依赖Otsu。最终阐明二值化的核心价值——将图像转化为算法可处理的结构化数据。

qq_35803412的博客 186

OpenCV 形态学处理相关知识点

整张图用一个固定阈值划分像素:大于阈值的设为一个值,小于阈值的设为另一个值。适合光照均匀、前景和背景差异明显的图像。

ahccqw的博客 272
上一篇: Mac配置QT
下一篇: Vue3:基础入门
CaptainDrake
博客等级 码龄6年 5363粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值