我目前想知道一个应该很容易的图像识别问题,但到目前为止找不到一个简单的解决方案.
输入是一个大约1百万像素的矩形图片,显示轻木表面.它上面有一个薄但可见的网格.网格为黑色黑色,规则且几乎为正方形(比宽度长约8%).网格大小正好是19x19.一般的纸板颜色是"木材",它可以变化,但往往是浅棕色.(更多信息)
表面上放置了许多小的圆形黑色和白色宝石.它们总是放在交叉点上,但由于人为错误,它们可能会稍微偏离.它们的颜色是纯黑色和白色.
该板覆盖0至约300块石头(361个交叉点的80%).黑色和白色宝石的数量大致相同.
边界的大小(没有放置石头的板的边缘)变化,但是已知是"小".
光线可能会导致棋盘上出现阴影.此外,它会在石头上(在光线方向上)出现一个白点.

我想检测一下石头在栅格上的位置.
我的想法是查看每个像素的亮度并将它们分为3类:光(白色宝石),中(宝石)和黑色(黑色宝石).具有许多黑色像素的区域被认为是黑色宝石,依此类推.
之后,黑色和白色区域的大小可用于计算实际网格大小.
另一个想法是识别网格线并使用它们来计算网格大小和位置.由于线条非常薄(通常被石头覆盖),我不知道该怎么做.
我很想听听你关于这个问题的想法.是否有适合的算法?你能想到很有帮助的酷炫技巧吗?我疯了,这个问题无法解决?我在C#工作,但欢迎使用任何语言.
JPG 文件可以通过 FF FE 标记包含文本注释。我对此有几个问题:
如何指定评论的长度?如果注释位于文件末尾,是否可以根本不指定长度?
是否可以有一个有效的 jpg 文件,而不包含仅包含注释的图像?这样的文件在二进制中会是什么样子?我假设它会是:
FF D8 - SOI:图像开始(注意后面没有帧数据) FF D9 - EOI:图像结束 FF FE - COM:文字注释 (二进制)-(文本)
我试图找出如何根据id列从表中选择多行.像这样的东西:
select * from table where id=1 or id=2 or id=3
Run Code Online (Sandbox Code Playgroud)
我应该遍历每个id并为每次迭代执行查询吗?
首先,我知道volatile不会使多个操作(如i++)原子化.这个问题是关于单个读或写操作.
我最初的理解是volatile只强制执行内存屏障(即其他线程将能够看到更新的值).
现在我注意到JLS第17.7节说明volatile还会产生单个读或写原子.例如,给定两个线程,两者都写入不同的值volatile long x,然后x最终将代表其中一个值.
我很好奇这是怎么回事.在32位系统上,如果两个线程并行写入64位并且没有"正确"同步(即某种锁定),则结果应该是混合.为清楚起见,让我们使用一个例子,其中线程1写入0L,而线程2将-1L写入相同的64位存储器位置.
T1 writes lower 32 bit
T2 writes lower 32 bit
T2 writes upper 32 bit
T1 writes upper 32 bit
Run Code Online (Sandbox Code Playgroud)
结果可能是0x0000FFFF,这是不希望的.如何volatile防止这种情况?
我还在别处读过,这通常不会降低性能.如何以极小的速度影响同步写入?
当尝试写入文件名“aux”的路径时,我很困惑地收到异常。同一目录和不同目录中的其他文件名都可以正常工作,我以前从未遇到过这种麻烦。
为了给您一个想法,请考虑以下测试代码:
Directory.CreateDirectory ("D:\\asdf"); // OK
File.WriteAllText ("D:\\asdf\\aux_", ""); // OK
try {
File.WriteAllText ("D:\\asdf\\aux.txt", ""); // fails
}
catch (ArgumentException ex) {
Console.WriteLine (ex);
}
try {
File.WriteAllText ("D:\\asdf\\aux", ""); // fails
}
catch (ArgumentException ex) {
Console.WriteLine (ex);
}
Console.WriteLine (string.Join ("\n", Directory.EnumerateFiles ("D:\\asdf")));
Run Code Online (Sandbox Code Playgroud)
最后一行打印创建了一个文件:
D:\asdf\aux_
Run Code Online (Sandbox Code Playgroud)
抛出两个相同的异常:
System.ArgumentException: FileStream will not open Win32 devices such as disk partitions and tape drives. Avoid use of "\\.\" in the path.
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean …Run Code Online (Sandbox Code Playgroud) 我最近偶然发现一个看似奇怪的行为,谷歌完全无法解释.
using Microsoft.VisualStudio.TestTools.UnitTesting;
class TestClass
{
public override bool Equals(object obj)
{
return true;
}
}
[TestMethod]
public void TestMethod1()
{
TestClass t = new TestClass ();
Assert.AreEqual (t, null); // fails
Assert.IsTrue (t.Equals (null)); // passes
}
Run Code Online (Sandbox Code Playgroud)
我希望这个测试能够成功.但是,在Visual Studio 2008/.NET 3.5中,它失败了.它是打算像那样还是一个bug?
我最近在尝试将AddRange(IEnumerable)添加到List时遇到了麻烦.可能是一个经典问题,但我还没有真正得到它.
我知道期望List参数的方法不满足于List,因为他们可能会尝试向List添加Base,这显然是不可能的.
但是,如果我得到正确的,因为IEnumerables本身不能改变,它应该在这种情况下工作.
我想到的代码看起来像这样:
class Foo
{
}
class Bar : Foo
{
}
class FooCol
{
private List<Foo> m_Foos = new List<Foo> ();
public void AddRange1(IEnumerable<Foo> foos)
{
m_Foos.AddRange (foos); // does work
}
public void AddRange2<T>(IEnumerable<T> foos) where T : Foo
{
m_Foos.AddRange (foos); // does not work
}
}
class Program
{
static void Main(string[] args)
{
FooCol fooCol = new FooCol ();
List<Foo> foos = new List<Foo> ();
List<Bar> bars = new List<Bar> ();
fooCol.AddRange1 (foos); …Run Code Online (Sandbox Code Playgroud) 我正在开发.NET 3.5中的用户控件.作为对某些事件的反应,我想在此控件上显示一个包含短文本的简单气泡,类似于众所周知的系统托盘通知气泡.我确信这是一项非常简单的任务,你能给我一个快速提示吗?
如何将System.Windows.Media.Brush转换为System.Drawing.Brush?
我正在尝试将system.windows.media.brush的颜色格式化为System.Drawing.Color对象.
下面的解决方案不起作用,因为它需要solidcolorbrush对象,而我需要转换的对象是system.windows.media.brush对象:
public System.Drawing.Color GetColor( System.Windows.Media.SolidColorBrush oBrush )
{
return System.Drawing.Color.FromArgb( oBrush.Color.A,
oBrush.Color.R,
oBrush.Color.G,
oBrush.Color.B );
}
Run Code Online (Sandbox Code Playgroud) 有时,由于未知原因,VS 2008会创建由换行符引导的解决方案文件.
Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 [...]
这发生在各种机器上,我不知道为什么会这样.谷歌搜索没有产生任何有用的结果.
现在,为什么我担心这个?因为我无法在Windows资源管理器中打开这些解决方案.我必须打开VS,选择文件 - >打开 - >解决方案,它工作正常.但是要从资源管理器中打开解决方案,我必须编辑sln文件并删除前导换行符.
编辑:在Leom的建议之后我测试了几次,发现问题完全取决于领先的换行符.
编辑:有趣:20 VS 10个显示相同的行为周围的其他方法:它仅可与领先的一行!至少在一些解决方案上 - 在其他解决方案上它与VS 2008完全相同.我很困惑.
c# ×5
.net ×2
atomicity ×1
brush ×1
collections ×1
equals ×1
file ×1
file-format ×1
header ×1
ienumerable ×1
inheritance ×1
java ×1
jpeg ×1
postgresql ×1
sql ×1
unit-testing ×1
volatile ×1
windows ×1
winforms ×1