杨振宁大学物理视频中黄色的字,c#写程序去掉(原版改进,三)

上一节,我们分清了主次矛盾,并搞定了主要矛盾(去掉黄色的字),这一节解决次要矛盾(矩形色带)。

我们的想法如图:

1,我们找到稳定黄色的最左边,最右边两点,画两条竖线,竖线高度10,根据这两条竖线,分别向外拉伸10条横线。代码如下:

for (int i = 240; i <480; i++)
                        {
                            byte fugair = 0; byte fugaig = 0; byte fugaib = 0;
                            byte fugai = 0;
                      
                            for (int j = 0; j < 640; j++)
                            {
                                int n = i * ww + j;
                                float hue = 0;
                 RGB2HSLTest(rgbValues[4 * n + 2], rgbValues[4 * n + 1], rgbValues[4 * n], ref hue);

                          if (hue > 35 && hue < 85 )//,黄色范围给的比较宽泛                       
                    {//黄色
                      
                        //新增,寻找黄色字50-63外接矩形202412130850
                        if (hue > 50 && hue < 63)//黄色收窄
                        {
                            if (j  < 找最小) { 找最小 = j ; 存黄色始末[0].X=找最小 ;存黄色始末[0].Y=i ;}
                            if (j > 找最大) { 找最大 = j ; 存黄色始末[1].X = 找最大; 存黄色始末[1].Y = i ; }
                        }

   rgbValues[4 * n + 2] = (byte)(rgbValues[4 * n + 2 - 4 * ww] / 2 + fugair / 2);
                                    rgbValues[4 * n + 1] = (byte)(rgbValues[4 * n + 1 - 4 * ww] / 2 + fugaig / 2);
                                    rgbValues[4 * n] = (byte)(rgbValues[4 * n - 4 * ww] / 2 + fugaib / 2);

}else{......}

2,存黄色始末[0]就是黄色最左点,存黄色始末[1]就是黄色最右点。

根据这两点,向外各画出十条直横线线,找到穿越点,我们目的是找到边界,即线A和B。如图:

代码如下:

   Point[] 左侧穿越点 = new Point[10]; int b= 0;
   
    for (int xy = 存黄色始末[0].Y - 5; xy < 存黄色始末[0].Y + 5; xy++)
    {
        for (int j = 存黄色始末[0].X; j >0; j--)//
        {
            int n = xy * 640 + j;
            if (Math.Abs(glob_buffer8[n] - glob_buffer8[n - 1]) > 10)
            {
                左侧穿越点[b].X = j;
                左侧穿越点[b].Y = xy;
                break;
            }
        }
        b++;
    }
    Point[] 右侧穿越点 = new Point[10]; int a = 0;
            for (int xy = 存黄色始末[1].Y - 5; xy < 存黄色始末[1].Y + 5; xy++)
            {
                for (int j = 存黄色始末[1].X; j < 640; j++)//
                {
                    int n = xy * 640+ j;
                    //找灰度化大于10的点
                    if (Math.Abs(glob_buffer8[n] - glob_buffer8[n - 1]) > 10)
                    {
                        右侧穿越点[a].X = j;
                        右侧穿越点[a].Y = xy;
                        break;
                    }

                }
                a++;
            }

3,利用a竖线和b竖线的起点,各往后退3个像素,往上做垂线,找到色带水平线cd,会找到c.y和d.y值,如果相差小于2个像素,我们就认为色带水平线确认了。如图:

代码如下:

   Point[] 向上穿越点 = new Point[2];
            向上穿越点[0].X = 左侧穿越点[0].X+3; 向上穿越点[0].Y = 左侧穿越点[0].Y;
            向上穿越点[1].X= 右侧穿越点[0].X-3; 向上穿越点[1].Y= 右侧穿越点[0].Y;
            int y上界 = 0;
            int y上界1 = 0;
            for (int xy = 向上穿越点[0].Y; xy >0; xy--)
            {

                int n = xy * 640 + 向上穿越点[0].X;
                if (Math.Abs(glob_buffer8[n] - glob_buffer8[n - 640]) > 10)
                {
              
                    y上界 = xy;
                    break;
                }
                
            }
            for (int xy = 向上穿越点[1].Y; xy > 0; xy--)
            {

                int n = xy * 640 + 向上穿越点[1].X;
                if (Math.Abs(glob_buffer8[n] - glob_buffer8[n - 640]) > 10)
                {
                  
                    y上界1 = xy;
                    break;
                }

            }

  if (Math.Abs(y上界1 - y上界) <= 2)
            {
                //ok,找到矩形色带上界
            }
            else
            {
                return; 
            }

4,色带矩形的高有一个经验值118.所以这个色带矩形在视频中有变化,我们有了自动化应对的方法。我们前面也说过了,色带矩形比其他灰度相比,少了50,现在色带矩形中所有像素全部加上50,就ok了。

看到我们上面红色return了没有,如果矩形估计失败(背景出现一堆学生),色带矩形还会在,但黄色还是稳定处理过了。

 // (  消除色带矩形 )            

  for (int i =左侧穿越点[0].X; i < 右侧穿越点[0].X; i++)
      
                for (int j = y上界 ; j < y上界 +118; j++)
             
                {
                    int temp = j * 640 + i;//原方法
                    rgbValues[temp * 4] = (byte)(rgbValues[temp * 4] + 50 > 255 ? 255 : rgbValues[temp * 4] + 50);
                    rgbValues[temp * 4 + 1] = (byte)(rgbValues[temp * 4 + 1] + 50 > 255 ? 255 : rgbValues[temp * 4 + 1] + 50);
                    rgbValues[temp * 4 + 2] = (byte)(rgbValues[temp * 4 + 2] + 50 > 255 ? 255 : rgbValues[temp * 4 + 2] + 50);
                                                        
                }

这个改进型原版,肯定比原版自适应性好很多!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/937401.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ORACLE逗号分隔的字符串字段,关联表查询

使用场景如下&#xff1a; oracle12 以前的写法&#xff1a; selectt.pro_ids,wm_concat(t1.name) pro_names from info t,product t1 where instr(,||t.pro_ids|| ,,,|| t1.id|| ,) > 0 group by pro_ids oracle12 以后的写法&#xff1a; selectt.pro_ids,listagg(DIS…

JS-手写new

我们先再来理一理原型 Object1 {name:deng,age:18 } Object2 {name:ru,age:18 } const Person function(){} Person.prototype Object1; const p1 new Person(); console.log(p1.name); //deng Person.prototype null; console.log(p1.name); //deng上面给Person的构造函…

LabVIEW实验站反馈控制系统

开发了一套基于LabVIEW的软X射线磁性圆二色实验站的反馈控制系统。这套系统主要用于实现对实验站高电压的精确控制&#xff0c;从而保持照射在样品上的流强稳定性&#xff0c;为分析样品吸收谱提供可靠基准&#xff0c;同时提供了易用的用户界面和强大的数据存储功能。 项目背景…

Matlab笔记---clear、clc、clear all应用

在MATLAB中&#xff0c;clear、clc 和 clear all 是三个常用的命令&#xff0c;它们各自有不同的作用&#xff1a; clc&#xff1a; clc 命令用于清除MATLAB命令窗口中的所有输出。它不会删除任何变量、函数或文件&#xff0c;只是清除屏幕上的显示内容&#xff0c;让你可以更…

Python Segmentation fault错误定位办法

1. 说明 Python3执行某一个程序时&#xff0c;报Segmentation fault (core dumped)错&#xff0c;但没有告知到底哪里出错&#xff0c;无法查问题&#xff0c;这时就需要一个库faulthandler来帮助分析。 2. 安装faulthandler faulthandler在Python3.3之后成为标准库&#xf…

康耐视智能相机(Insight)通过ModbusTCP发送字符串到倍福(BECKHOFF)PLC中

文章目录 1.背景2.分析3.实现3.1.PLC的ModbusTCP_Server3.1.1.安装TF6250-Modbus-TCP3.1.2.PLC设置 3.2.智能相机的ModbusTCP_Client3.2.1.了解ModbusTCP的协议3.2.2.根据协议写代码3.2.2.1.纯函数代码3.2.2.2.脚本代码 3.2.3.非脚本处理时的代码逻辑图3.2.4.关于代码的问题及解…

语音芯片赋能可穿戴设备:开启个性化音频新体验

在科技日新月异的今天&#xff0c;语音芯片与可穿戴设备的携手合作&#xff0c;正引领我们步入一个前所未有的个性化音频时代。这一创新融合&#xff0c;用户可以享受到更加个性化、沉浸式的音频体验。下面将详细介绍语音芯片与可穿戴设备合作的优点和具体应用。 1. 定制化音效…

医学图像之图像分割数据集视神经青光眼分割数据集labelme格式903张2类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;903 标注数量(json文件个数)&#xff1a;903 标注类别数&#xff1a;2 标注类别名称:["opticDisc","opticCup"] 每个类…

Linux shell 使用 trap 命令优雅处理程序中断: shell 中的回调、锁与事务、以及 debug 调试

来看一个常见的场景 假设你正在开发一个数据备份脚本。这个脚本需要执行以下操作&#xff1a; 创建临时工作目录将数据复制到临时目录压缩打包清理临时文件 #!/bin/bashWORK_DIR"/tmp/backup_$(date %Y%m%d)"echo "开始备份..." mkdir -p "$WORK_D…

jenkins构建 Webhook 触发器

目的是要让gitlab上面的项目更新了版本&#xff0c;Jenkins上面自动去执行新版本 项目地址 不用插件实现标签触发任务 Jenkins上面创建任务 这里面需要更改下 #网址http://jenkins.wang.org:8080/job/webhook-demo/configure生成个随机密码&#xff0c;测试用123456也可以 […

iPhone苹果相册视频怎么提取音频?

在数字时代&#xff0c;视频已成为我们记录生活、分享故事的重要方式。然而&#xff0c;有时候我们只想保留视频中的音频部分&#xff0c;比如一段动人的背景音乐或是一段珍贵的对话。那么&#xff0c;苹果相册视频怎么提取音频呢&#xff1f;本文将介绍三种简单且实用的方法&a…

前端成长之路:CSS字体、文本属性和引入方式

本文主要介绍CSS的字体属性和文本属性&#xff0c;最后再介绍CSS在HTML中的引入方式。 CSS字体属性 CSS Fonts&#xff08;字体&#xff09;属性能用于定义字体系列属性&#xff0c;包括但不限于字体大小、粗细、字体样式等。 字体系列 在CSS中使用font-family属性定义文本…

PostgreSQL 常用运维SQL整理

一、查询并杀会话 -- 查询会话 select pid,usename,client_addr,client_port,query_start,query,wait_event from pg_stat_activity; -- 杀会话 select pg_terminate_backend(pid号); -- 使用如下命令自动生成杀会话语句 select datid,datname,pid,usesysid,usename,applicat…

item2 for macos

安装Item2 brew install iterm2 查看终端类型 cat /etc/shells Mac OS X 10.15 已经将默认的shell从Bash换成了zsh&#xff0c;所以不用安装&#xff0c;10.15以前的可以使用下面的命令进行安装 brew install zsh 安装Oh My ZSH # curl sh -c "$(curl -fsSL https://ra…

Python的3D可视化库【vedo】2-1 (plotter模块) 绘制器的使用

文章目录 1 相关用语及其关系2 Plotter类的基本使用3 Plotter类具体的初始化设置3.1 全部初始化参数3.2 使用不同的axes vedo是Python实现的一个用于辅助科学研究的3D可视化库。 vedo的plotter模块封装了绘制器类Plotter。 Plotter实例可以用于显示3D图形对象、控制渲染器行为、…

特征交叉-CAN学习笔记代码解读

一 核心模块coaction 对于每个特征对(feature_pairs)weight, bias 来自于P_inductionP_fead是MLP的input 举个例子&#xff1a;如果是用户ID和产品ID的co-action&#xff0c;且产品ID是做induction&#xff0c;用户ID是做feed。 step1 用户ID/产品ID都先形成一个向量&#xf…

【Java面试】深拷贝、浅拷贝和引用拷贝三者的区别

浅拷贝&#xff1a;浅拷贝会在堆上创建一个新的对象&#xff08;区别于引用拷贝的一点&#xff09;&#xff0c;不过&#xff0c;如果原对象内部的属性是引用类型的话&#xff0c;浅拷贝会直接复制内部对象的引用地址&#xff0c;也就是说拷贝对象和原对象共用同一个内部对象。…

EasyGBS点对点穿透P2P远程访问技术在安防视频监控中的应用

随着信息技术的快速发展&#xff0c;安防视频监控系统在公共安全领域的应用变得越来越广泛。传统的视频监控系统多依赖于中心服务器进行视频流的集中处理和分发&#xff0c;这不仅增加了网络带宽的负担&#xff0c;还可能成为系统性能瓶颈。为了解决这些问题&#xff0c;P2P&am…

Vue入门到精通:核心语法—模板语法

Vue入门到精通&#xff1a;核心语法—模板语法 Vue.js因其简单、易用和高效的特点&#xff0c;自推出以来一直受到广泛关注。Vue.js的核心概念和技术包括模板语法、计算属性、事件监听、动态样式绑定、条件渲染指令&#xff08;如v-if&#xff09;、列表渲染指令&#xff08;如…

C++中如何实现接口继承与实现继承,以及它们的区别?

概念 在 C 中&#xff0c;接口继承和实现继承是两种不同的继承方式&#xff0c;它们在设计模式、代码复用和多态性方面有着不同的应用。下面将分别解释这两者的概念、实现方式及其区别。 接口继承 接口继承指的是只继承类的接口&#xff08;即公共的成员函数声明&#xff09…