给出了由透视图扭曲的矩形的2d图片:
我知道形状最初是一个矩形,但我不知道它的原始大小.
如果我知道这张照片中角落的像素坐标,我该如何计算原始比例,即矩形的商(宽度/高度)?
(背景:目标是自动取消矩形文档的照片,边缘检测可能会用hough变换完成)
已经讨论了是否有可能根据给出的信息确定宽度:高度比.我天真的想法是它必须是可能的,因为我认为没有办法将例如1:4的矩形投射到上面描绘的四边形上.该比率显然接近1:1,因此应该有一种方法可以在数学上确定它.然而,除了我的直觉猜测,我没有证据证明这一点.
我还没有完全理解下面提出的论点,但我认为必须有一些隐含的假设,即我们在这里缺少这种假设并且有不同的解释.
然而,经过几个小时的搜索,我终于找到了一些与问题相关的论文.我很难理解那里使用的数学,到目前为止还没有成功.特别是第一篇论文似乎准确地讨论了我想要做的事情,遗憾的是没有代码示例和非常密集的数学.
张正友,何立伟,"白板扫描和图像增强" http://research.microsoft.com/en-us/um/people/zhang/papers/tr03-39.pdf p.11
"由于透视失真,矩形的图像看起来是四边形.但是,由于我们知道它是空间中的矩形,我们能够估计相机的焦距和矩形的纵横比."
ROBERT M. HARALICK"从矩形的透视投影中确定相机参数" http://portal.acm.org/citation.cfm?id=87146
"我们将展示如何使用3D空间中未知大小和位置的矩形的2D透视投影来确定相对于矩形平面图的相机视角参数."
geometry reverseprojection image-processing computer-vision projective-geometry
有时我需要一个单一方法的硬编码查找表.
我也可以创建这样的数组
第一种情况的例子:
public int Convert(int i)
{
int[] lookup = new[] {1, 2, 4, 8, 16, 32, 666, /*...*/ };
return lookup[i];
}
Run Code Online (Sandbox Code Playgroud)
据我所知,每次执行此方法时,.net引擎都会创建一个新的查找数组.这是正确的,还是JITer足够聪明,可以在调用之间缓存和重用数组?
我认为答案是否定的,所以如果我想确保数组在调用之间缓存,一种方法是static
:
第二种情况的例子:
private static readonly int[] lookup = new[] { 1, 2, 4, 8, 16, 32, 666, /*...*/ };
public int Convert(int i)
{
return lookup[i];
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在不污染我的类的命名空间的情况下执行此操作?我可以以某种方式声明一个只在当前范围内可见的静态数组吗?
给定一个凸polgyon和一个数字N,我如何找到最小的多边形
例如,假设我有一组点并计算它们的凸包(绿色).现在我想找到包含所有点的最小四边形(红色)
很容易看出任何其他具有4个角的多边形要么更大,要么不能包含所有点.但是如何在一般情况下找到这个多边形呢?
编辑:
最小的多边形是指覆盖最小区域的多边形,但我不确定最小的圆周是否会产生不同的结果.
我添加了另外两个示例图片,遗憾的是,在其中一个答案中似乎没有使用"删除边缘"方法
一些背景资料:
目标是通过图像识别准确地确定形状.例如拍摄一个长方体的照片.2D照片中框内的所有点都将包含在6角凸多边形中.然而,由于真实世界的形状没有完美的角落,并且相机增加了一些模糊,因此该多边形的边缘将是圆形的.请参阅问题从凸点获取角落的附图
language-agnostic algorithm geometry polygon computational-geometry
如何将IFormatProvider传递给StreamWriter?
具体来说我想创建一个
new StreamWriter("myfile.txt", CultureInfo.InvariantCulture);
TextWriter和StringWriter在构造函数中有一个参数,但StreamWriter没有.
属性stringWriter.FormatProvider是readonly.
我可以想到三个似乎不好的解决方案:
有没有办法为StreamWriter指定FormatProvider?如果我可以设置属性,则基于TextWriter的继承,StreamWriter必须具有处理此功能的方法.
我正在寻找一种方法来为所有现有的TraceSources添加和删除TraceListener.
(我不确定我的方法是否正确,我可以使用其他方法?基本上我想将所有跟踪输出记录到使用当前项目名称作为文件名的文件中.每当用户创建或重新打开项目时,我想要将日志附加到正确的文件.一次只能打开一个项目.)
代码示例:
我在我的应用程序中创建了几个TraceSource,每个类一个
public class Class1
{
private static readonly System.Diagnostics.TraceSource trace =
new System.Diagnostics.TraceSource("Class1");
}
public class Class2
{
private static readonly System.Diagnostics.TraceSource trace =
new System.Diagnostics.TraceSource("Class2");
}
Run Code Online (Sandbox Code Playgroud)
我现在想在运行时向我的所有traceSource添加或删除traceListener,如下所示:
private System.Diagnostics.TextWriterTraceListener myListener;
private onProjectOpen()
{
// user created a new project or opened an existing one
myListener = new System.Diagnostics.TextWriterTraceListener("log-"+projectname+".log");
ALL_TRACESOURCES.Add ( myListener) ; // <-- how to do this?
}
private onProjectClose()
{
// user closed a project
ALL_TRACESOURCES.Remove( myListener) ; // <-- how to do this? …
Run Code Online (Sandbox Code Playgroud) 如果.net程序在终止之前未能明确设置退出代码(通过调用Environment.Exit()
/ Appliation.Current.Shutdown()
/ ...),那么该进程的退出代码是什么?
正常终止是否总是导致退出代码为零,以及其他可能的情况是什么?
根据Hans Passant 从相关问题获得ExitCode From Exception Handler的回答:" 如果程序在异常上死亡,则其退出代码通常与底层异常错误代码相同 ".
因此,一个unaugth异常可以输出退出代码.这是总的情况,并始终保证是底层的异常错误代码异于零,并在特定的范围内?
是否有其他情况,.net框架或Windows可以自动设置另一个退出代码,例如一些非异常相关的崩溃(可能吗?),还是强制任务终止?
换句话说,我可以通过退出代码确定程序是否以任何异常方式终止?
或者如果在某些异常情况下也可能出现零退出代码,我是否可以Environment.Exit(somevalue)
在程序的所有正常终止路径中包含a,并确保在崩溃的情况下永远不会出现此退出代码?
动机:
由于并非所有的exeptions都可以在没有严重变通方法的情况下被捕获,并且由于除了未被捕获的激活之外可能还有其他原因导致程序突然终止,因此确保所有代码路径都调用Environment.Exit()是不可能的.这就是为什么我有兴趣确定是否可以使用退出代码可靠地判断程序是否正常退出.
我有一些奇怪的表现结果,我无法解释.看来这一行
d = new double[4, 4]{{1, 0, 0, 0},
{0, 1, 0, 0},
{0, 0, 1, 0},
{0, 0, 0, 1},};
Run Code Online (Sandbox Code Playgroud)
比这个慢4倍
d = new double[4, 4];
d[0, 0] = 1; d[0, 1] = 0; d[0, 2] = 0; d[0, 3] = 0;
d[1, 0] = 0; d[1, 1] = 1; d[1, 2] = 0; d[1, 3] = 0;
d[2, 0] = 0; d[2, 1] = 0; d[2, 2] = 1; d[2, 3] = 0;
d[3, 0] = 0; d[3, …
Run Code Online (Sandbox Code Playgroud) 我正在使用Windows错误报告API调用RegisterApplicationRestart来注册应用程序,当应用程序崩溃或重新启动PC时,WER会自动重新启动该应用程序.
但是,当应用程序崩溃时,会弹出默认的WER对话框("xyz已停止响应"/"您是否要发送有关该问题的更多信息"),并且只有在关闭此对话框后,程序才会重新启动.
有没有办法压制这个对话框?
如果我调用SetErrorMode(SEM_NOGPFAULTERRORBOX),则会按预期禁止该对话框,但重启本身也会停止工作.
如果我通过更改注册表项全局禁用该对话框HKEY_CURRENT_USER\Software\ Microsoft\Windows\Windows Error Reporting\DontShowUI
,我得到相同的结果:对话框被禁止,但应用程序也不会重新启动.
我知道像第二个看门狗程序那样的解决方法,但我真的希望使用Windows错误报告API的工具尽可能简单地解决这个问题.
我使用Linq数据集来查询数据表.如果我想在数据表上的"Column1"上执行一个组,我使用以下查询
var groupQuery = from table in MyTable.AsEnumerable()
group table by table["Column1"] into groupedTable
select new
{
x = groupedTable.Key,
y = groupedTable.Count()
}
Run Code Online (Sandbox Code Playgroud)
现在我想在两列"Coulmn1"和"Column2"上执行group by.任何人都可以告诉我语法或者在数据表中提供一个解释多个组的链接吗?
谢谢
我有一个BlockingCollection.生产者任务向其添加项目,消费者任务删除项目.
现在我想限制集合中的项目数,如果添加更多项目,则自动丢弃旧数据.该集合永远不应包含多于N
最近添加的项目.
因此,如果生产者添加新项目的速度快于消费者删除它们,我希望消费者只处理最新的项目.
我可以BlockingCollection
在其构造函数中限制a的大小,但当然这只是意味着它在添加更多项时会阻塞,而不是它会删除旧项.
(我不希望生产者端阻塞,只有消费者方在从空集合中检索项目时才会阻塞.)
我目前的解决方案是黑客攻击,只适用于1的大小限制:(
而且我不确定它是否可靠.)
// My consumer task:
foreach (var item in blockingCollection.GetConsumingEnumerable())
{
var lastItem = item;
var lastItemTmp = item;
while (blockingCollection.TryTake(out lastItemTmp))
lastItem = lastItemTmp;
// Now lastItem contains the most recent item in the collection,
// and older items have been discarded.
// Proceed consuming lastItem ...
}
Run Code Online (Sandbox Code Playgroud)
有更清洁的解决方案吗?
c# collections multithreading producer-consumer thread-safety
c# ×8
.net ×2
arrays ×2
crash ×2
geometry ×2
performance ×2
.net-3.5 ×1
.net-4.0 ×1
algorithm ×1
collections ×1
cultureinfo ×1
dataset ×1
datatable ×1
exit-code ×1
filestream ×1
group-by ×1
linq ×1
logging ×1
optimization ×1
polygon ×1
restart ×1
streamwriter ×1
trace ×1
windows ×1