小编maf*_*afu的帖子

简单的图像识别:网格上的黑色和白色宝石

我目前想知道一个应该很容易的图像识别问题,但到目前为止找不到一个简单的解决方案.

输入是一个大约1百万像素的矩形图片,显示轻木表面.它上面有一个薄但可见的网格.网格为黑色黑色,规则且几乎为正方形(比宽度长约8%).网格大小正好是19x19.一般的纸板颜色是"木材",它可以变化,但往往是浅棕色.(更多信息)

表面上放置了许多小的圆形黑色和白色宝石.它们总是放在交叉点上,但由于人为错误,它们可能会稍微偏离.它们的颜色是纯黑色和白色.

该板覆盖0至约300块石头(361个交叉点的80%).黑色和白色宝石的数量大致相同.

边界的大小(没有放置石头的板的边缘)变化,但是已知是"小".

光线可能会导致棋盘上出现阴影.此外,它会在石头上(在光线方向上)出现一个白点.

goban

我想检测一下石头在栅格上的位置.

我的想法是查看每个像素的亮度并将它们分为3类:光(白色宝石),中(宝石)和黑色(黑色宝石).具有许多黑色像素的区域被认为是黑色宝石,依此类推.

之后,黑色和白色区域的大小可用于计算实际网格大小.

另一个想法是识别网格线并使用它们来计算网格大小和位置.由于线条非常薄(通常被石头覆盖),我不知道该怎么做.

我很想听听你关于这个问题的想法.是否有适合的算法?你能想到很有帮助的酷炫技巧吗?我疯了,这个问题无法解决?我在C#工作,但欢迎使用任何语言.

image-recognition

6
推荐指数
1
解决办法
2436
查看次数

JPG 文件中的文本注释如何工作?

JPG 文件可以通过 FF FE 标记包含文本注释。我对此有几个问题:

  1. 如何指定评论的长度?如果注释位于文件末尾,是否可以根本不指定长度?

  2. 是否可以有一个有效的 jpg 文件,而不包含仅包含注释的图像?这样的文件在二进制中会是什么样子?我假设它会是:

FF D8 - SOI:图像开始(注意后面没有帧数据)
FF D9 - EOI:图像结束
FF FE - COM:文字注释
(二进制)-(文本)

jpeg file-format header

6
推荐指数
2
解决办法
1万
查看次数

PostgreSQL查询根据id返回多行

我试图找出如何根据id列从表中选择多行.像这样的东西:

select * from table where id=1 or id=2 or id=3
Run Code Online (Sandbox Code Playgroud)

我应该遍历每个id并为每次迭代执行查询吗?

sql postgresql

6
推荐指数
2
解决办法
6414
查看次数

为什么以及volatile如何暗示原子读/写?

首先,我知道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防止这种情况?

我还在别处读过,这通常不会降低性能.如何以极小的速度影响同步写入?

java volatile atomicity

6
推荐指数
2
解决办法
201
查看次数

无法写入文件名为“aux”的任何路径

当尝试写入文件名“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)

.net c# windows file

6
推荐指数
1
解决办法
2719
查看次数

C#UnitTest - 如果参数为null,Assert.AreEqual()不会调用Equals

我最近偶然发现一个看似奇怪的行为,谷歌完全无法解释.


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?

c# unit-testing equals visual-studio

5
推荐指数
2
解决办法
2万
查看次数

C#无法从IEnumerable <Base>转换为IEnumerable <Derived>

我最近在尝试将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)

c# collections ienumerable inheritance

5
推荐指数
1
解决办法
3652
查看次数

C#如何在用户控件上显示文本气泡?

我正在开发.NET 3.5中的用户控件.作为对某些事件的反应,我想在此控件上显示一个包含短文本的简单气泡,类似于众所周知的系统托盘通知气泡.我确信这是一项非常简单的任务,你能给我一个快速提示吗?

.net c# user-interface winforms

5
推荐指数
2
解决办法
1万
查看次数

将System.Windows.Media.Brush转换为System.Drawing.Brush

如何将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)

c# brush

5
推荐指数
1
解决办法
2万
查看次数

关于Visual Studio解决方案文件中的主要换行符

有时,由于未知原因,VS 2008会创建由换行符引导的解决方案文件.


Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
[...]

这发生在各种机器上,我不知道为什么会这样.谷歌搜索没有产生任何有用的结果.

现在,为什么我担心这个?因为我无法在Windows资源管理器中打开这些解决方案.我必须打开VS,选择文件 - >打开 - >解决方案,它工作正常.但是要从资源管理器中打开解决方案,我必须编辑sln文件并删除前导换行符.

编辑:在Leom的建议之后我测试了几次,发现问题完全取决于领先的换行符.

编辑:有趣:20 VS 10个显示相同的行为周围的其他方法:它可与领先的一行!至少在一些解决方案上 - 在其他解决方案上它与VS 2008完全相同.我很困惑.

projects-and-solutions visual-studio-2008

5
推荐指数
2
解决办法
1312
查看次数