MSER+NMS文本区域检测

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MSER+NMS文本区域检测相关的知识,希望对你有一定的参考价值。

参考技术A 1.MSER
MSER最大稳定极值区域(MSER-Maximally Stable Extremal Regions),该算法是2002提出的,主要是基于分水岭的思想来做图像中斑点的检测。

原理:MSER对一幅已经处理成灰度的图像做二值化处理,这个处理的阈值从0到255递增,这个阈值的递增类似于在一片土地上做水平面的上升,随着水平面上升,高高低低凹凸不平的土地区域就会不断被淹没,这就是分水岭算法,而这个高低不同,就是图像中灰度值的不同。而在一幅含有文字的图像上,有些区域(比如文字)由于颜色(灰度值)是一致的,因此在水平面(阈值)持续增长的一段时间内都不会被覆盖,直到阈值涨到文字本身的灰度值时才会被淹没,这些区域就叫做最大稳定极值区域。

其中,Qi表示阈值为i时的某一连通区域,Δ 为灰度阈值的微小变化量,q(i) 为阈值是 i 时的区域 Qi 的变化率。
当q(i) 为局部极小值时,则Qi 为最大稳定极值区域。

注释:参考网站
参考官网:
https://docs.opencv.org/3.4/d3/d28/classcv_1_1MSER.html
https://blog.csdn.net/wsp_1138886114/article/details/100135824

JavaScript - 检测文本区域中的变化

【中文标题】JavaScript - 检测文本区域中的变化【英文标题】:JavaScript - detecting change in a textarea 【发布时间】:2010-11-29 19:32:48 【问题描述】:

我希望两个文本区域的值始终相等。 监听“更改”事件是不够的,因为我希望这些字段即使在有焦点时也是相等的。 监听按键似乎也不起作用,因为在使用新字母更新字段值之前触发了此事件,因此我不确定是否有使用按键处理程序获取字段当前值的好方法以便将其复制到另一个字段。 有什么想法吗?

【问题讨论】:

类似:***.com/questions/574941/… 【参考方案1】:

keyup 事件怎么样?

【讨论】:

IE中的paste事件和FF中的input事件也值得一提 如何检测粘贴和输入事件? 不幸的是,这也捕获了箭头键和 Tab 键,其中的内容不一定有任何变化。你如何解决这些问题? @Nikki Erwin Ramirez 结合 focusin&focusout【参考方案2】:

我也遇到了同样的问题……

textarea 的值可以通过多种方式更改...我将仅提及我不知道如何检测的那些:

鼠标上下文粘贴 键盘上下文菜单粘贴 拖放表单其他应用程序、对象等 Shift Drag&Drop 从相同的文本(在其他位置复制所选内容) 使用 Ctrl+Insert - Shift+Insert(复制和粘贴的另一种方式)

我曾尝试为我知道的每个事件(onkeyup、onkeydown、onmouseup、onmousedown 等)创建一个事件处理程序,但是使用以前的一些粘贴方式,没有人被解雇,所以没办法控制何时发生。

除了放置一个计时器,我没有其他解决方案。

啊!内容也可以在没有焦点的情况下更改...拖放案例。

更不用说是否也可以通过 JavaScript 更改,最丑陋的东西被检测到......没有方法被触发!!!

我不想设置计时器(这样做非常难看,并且可能会导致错误)。

如果计时器被触发但另一个页面正在加载(用户单击链接)...您必须控制所有对象存在...否则会带来错误消息(某些浏览器会将其显示为模态窗口,而其他人会忽略它)...所以用户的印象很差...在最坏的情况下...对您的事件处理程序的调用可能会失败,因为您的函数在计时器调用之前被破坏了。

使用计时器,您总是必须进行页面卸载,因此当页面被终止时(例如,当您转到另一个页面时)会被停用或销毁。

这类事情比需要的复杂得多,而且将来更新起来也很糟糕。

为了确保计时器不会失败,我在第一句话中做了这种丑陋的事情:clearTimeout(MyTimer);

如果我需要计时器每 X 毫秒重复一次...在函数内部我会做 setTimeout(function()MyFunction();)

这样,如果事情在不适当的情况下被破坏,否则调用计时器处理程序不会导致错误。

此外,必须对函数 MyFunction 内的每个句子进行错误控制...必须确保使用的任何对象都存在...在每个句子上...这是不可能完成的...所以必须使用 try catch已添加。

使用计时器时可以做的另一件事是忽略破坏问题,让用户在页面卸载时获得非常糟糕的印象。

为了确保没有启动计时器...我唯一知道的是在卸载时提供正文...但是一些丑陋的浏览器不会触发它(以避免程序员不让您转到另一个页面).. . 所以我必须做的事情好像 onunload 不存在...所以当对象被销毁时可以调用计时器...错误总是会发生...

太棘手了,无法确保在使用计时器时不会出现错误窗口:

var MyTimer;
function MyTimer_Handler()
 try
  clearTimeout(TemporizadorCapaLogin);
  try
   // Do whatever the timer must do
  Catch(theError)
   // Your own code to control errors, but have in mind that while running the lines you write here can also cause error because while running this the objects get destroyed, so better not to put anything
  
  MyTimer=setTimeout(function()tryMyTimer_Handler()Catch(theError),theIntervalToRepeatInMiliseconds);
 Catch(theError)

tryMyTimer=setTimeout(function()tryMyTimer_Handler()Catch(theError),theIntervalToRepeatInMiliseconds);Catch(theError)

看看我在说什么...太丑陋的代码...但所有尝试都需要,否则一些浏览器可能会显示错误消息,告诉卸载页面发生时某些内容不存在。

这也是最糟糕的,要真正确保你会尝试这个:

var MyTimer;
function MyTimer_Handler()
 try
  clearTimeout(TemporizadorCapaLogin);

  try
   // Do only one sentence at a time
  Catch(theError) // Ther is no way to ensure any line on Catch part can not cause an error because objects can have being destroyed before and while running this part

  try
   // Do only one sentence at a time
  Catch(theError) // Ther is no way to ensure any line on Catch part can not cause an error because objects can have being destroyed before and while running this part

  // Repeat for each sentence

  MyTimer=setTimeout(function()tryMyTimer_Handler()Catch(theError),theIntervalToRepeatInMiliseconds);
 Catch(theError)

tryMyTimer=setTimeout(function()tryMyTimer_Handler()Catch(theError),theIntervalToRepeatInMiliseconds);Catch(theError)

但是 TryCatch 的这种连续性与将所有内容组合在一个上是一样的...所以没有任何好处...正如您所看到的那样使用计时器非常痛苦...只是因为没有办法以确保不会发生错误。

原因是某些浏览器上的事件连续性:

    用户请求页面 页面已下载 页面激活定时器 用户单击链接或只是关闭选项卡...这会导致页面卸载 浏览器开始逐个对象销毁 在全部销毁之前触发的计时器 定时器代码已运行,但某些对象不存在,已被销毁 在运行此类代码时,浏览器会继续销毁更多对象 (同时)

例如,当在计时器内执行任何代码行时,JavaScript 管理器可能会在某些浏览器上被破坏,因此它会失败并且浏览器会显示一个模态窗口,告诉您的页面编码错误,该语句也可以是就这么简单:alert('bla bla bla');

到目前为止,我还没有找到避免这种情况的方法...除了在所有计时器上执行此操作:

var MyTimer;
function MyTimer_Handler()
 try
  clearTimeout(TemporizadorCapaLogin);
  try
   // Do whatever the timer must do
  Catch(theError)
  MyTimer=setTimeout(function()tryMyTimer_Handler()Catch(theError),theIntervalToRepeatInMiliseconds);
 Catch(theError)

tryMyTimer=setTimeout(function()tryMyTimer_Handler()Catch(theError),theIntervalToRepeatInMiliseconds);Catch(theError)

这也不是一个完美的解决方案......如果浏览器只是在计时器被触发但在第一次尝试之前(接近完美的毫秒 sycn 竞争条件)销毁 de JavaScript 管理器,它也会导致浏览器显示消息。

但是因为有时候,有些事情会在一段时间后完成......没有更好/完美的解决方案,那是我能做的最好的!

我个人很讨厌这种编码不好的浏览器(其中之一是 IE),但我必须支持它们!!!

【讨论】:

【参考方案3】:

此处讨论了特定于浏览器的方法:onpropertychange for a textbox in Firefox?

但是,经过各种实验,我发现唯一的跨浏览器方法是使用 window.setInterval() 检查更改(例如每 20 毫秒)。不优雅,但非常有效。

【讨论】:

【参考方案4】:

//

function clonekeyup(e)
 var e= window.event || e;
 var who= e.target || e.srcElement;
 var val= who.value;
 var tem, temp, TA= document.getElementsByTagName('textarea'), L= TA.length;
 while(L)
  tem= TA[--L];
  if(tem.onchange== arguments.callee && tem.value!= val) tem.value= val;
 

将函数 onkeyup 和 onchange 分配给要相互反映的文本区域。 例如,这会将处理程序分配给所有文本区域。

var tem, TA= document.getElementsByTagName('textarea'), L= TA.length;
while(L)
 tem= TA[--L];
 tem.onkeyup= tem.onchange= clonekeyup;

【讨论】:

【参考方案5】:

使用 shift+letter 时 Keyup 无法正常工作,但如果将其绑定到窗口对象,则可以正常工作。

这是一个利用它的 jQuery 插件:

$.fn.edited = function(callback) 
  this.each(function() 

    var that = $(this);
    var active = false;

    that.focusin(function() 
      active = true;
    );

    that.focusout(function() 
      active = false;
    );

    $(window).keyup(function(e) 
      if (active) 
        callback(e);
      
    );

  );
;   

用法:

$("textarea").edited(function()
    ...
);

【讨论】:

投反对票,因为问题是关于 JavaScript,而不是 CoffeeScript。 另外,看起来像 jQuery 而不是 CoffeeScript

以上是关于MSER+NMS文本区域检测的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 例程 300篇247. 特征检测之最大稳定极值区域(MSER)

文本区域 onchange 检测

使用 Opencv 检测图像中的文本区域

Javascript检测文本区域中的滚动条

检测屏幕截图中的文本区域

检测某个单词刚刚输入到文本区域