c#在另一个图像中检测到的正方形中拟合图像

时间:2017-04-30 18:54:59

标签: c# image uwp aforge

所以基本上我需要制作一个适合在墙上方框架上绘画的应用程序。我正在使用aforge来检测正方形,并使用它的角落放置并调整我想要的图像大小。这是通过按下触发imageAdapt()方法的第三个按钮来完成的。不幸的是,图像没有重新缩放到正确的尺寸并且放错了。这是我的代码:

    namespace MyFirstJob
{
public sealed partial class MainPage : Page
{
    public static int a = -1;
    public static int b = -1;
    FolderPicker folderPicker1 = new Windows.Storage.Pickers.FolderPicker();
    FolderPicker folderPicker2 = new Windows.Storage.Pickers.FolderPicker();
    StorageFolder folder1;
    StorageFolder folder2;
    System.Collections.Generic.IReadOnlyList<StorageFile> filesList1;
    System.Collections.Generic.IReadOnlyList<StorageFile> filesList2;

    public MainPage()
    {
        InitializeComponent();
        folderPicker1.FileTypeFilter.Add(".png");
        folderPicker2.FileTypeFilter.Add(".png");
    }

    private async void button1_Click(object sender, RoutedEventArgs e)
    {
        a++;
        folder1 = await folderPicker1.PickSingleFolderAsync();
        filesList1 = await folder1.GetFilesAsync();
        var stream = await 
        filesList1[a].OpenAsync(Windows.Storage.FileAccessMode.Read);
        var bitmapImage = new Windows.UI.Xaml.Media.Imaging.BitmapImage();
        await bitmapImage.SetSourceAsync(stream);
        image1.Source = bitmapImage;
    }

    private async void button2_Click(object sender, RoutedEventArgs e)
    {
        b++;
        folder2 = await folderPicker2.PickSingleFolderAsync();
        filesList2 = await folder2.GetFilesAsync();
        var stream = await 
        filesList2[b].OpenAsync(Windows.Storage.FileAccessMode.Read);
        var bitmapImage = new Windows.UI.Xaml.Media.Imaging.BitmapImage();
        await bitmapImage.SetSourceAsync(stream);
        image2.Source = bitmapImage;
    }

    private async void adaptImage()
    {
        var stream = await 
        filesList1[a].OpenAsync(Windows.Storage.FileAccessMode.Read);
        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
        WriteableBitmap writableBitmap = new 
        WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight);
        writableBitmap.SetSource(stream);
        BlobCounter blobCounter = new BlobCounter();
        blobCounter.MinHeight = 100;
        blobCounter.MinWidth = 100;
        blobCounter.MaxHeight = 600;
        blobCounter.MaxWidth = 600;
        blobCounter.ProcessImage((Bitmap)writableBitmap);
        Blob[] blobs = blobCounter.GetObjectsInformation();

        SimpleShapeChecker shapeChecker = new SimpleShapeChecker();

        foreach (var blob in blobs)
        {
            List<IntPoint> edgePoints = 
            blobCounter.GetBlobsEdgePoints(blob);
            List<IntPoint> cornerPoints;

            if (shapeChecker.IsQuadrilateral(edgePoints, out cornerPoints))
            {
                if (shapeChecker.CheckPolygonSubType(cornerPoints) == PolygonSubType.Square)
                {

                    double lenght = getLenght(cornerPoints[0].X, 
                cornerPoints[0].Y, cornerPoints[1].X, cornerPoints[1].Y);
                    image2.Height = lenght;
                    image2.Width = lenght;
                    image2.Margin = new Thickness(cornerPoints[0].X, 
                     cornerPoints[0].Y, 0, 0);
                }
            }
        }

    }

    private void button3_Click(object sender, RoutedEventArgs e)
    {
        adaptImage();
    }

    private double getLenght(int x1, int y1, int x2, int y2)
    {
        return Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    }

 }
}

当它开始时:第一个按钮加载背景,第二个按钮加载绘画,然后最后一个按钮使其适合绘画     

加载背景后一切正常     

加载绘画(随机方块)     

画面不适合在广场上的最终图像     

1 个答案:

答案 0 :(得分:1)

由于您没有上传XAML代码,我添加了以下XAML代码进行测试,它可以很好地支持您的代码片段。

<Canvas>
    <Image x:Name="image1" ></Image>
    <Image x:Name="image2" ></Image> 
    <StackPanel Canvas.Top="20">
        <Button x:Name="Button1" Click="button1_Click" Content="button1"></Button>
        <Button x:Name="Button2" Click="button2_Click" Content="button2"></Button>
        <Button x:Name="Button3" Click="button3_Click" Content="button3"></Button>
    </StackPanel>
</Canvas>

背后的代码是一样的。我在build 15036上测试过。对于aforge我使用AForge Core 2.2.5.60302Imaging 2.2.5.60302

但我可以使用Grid面板作为父容器重现您的问题,同时广场的cornerPoints不会从点0,0开始。在Grid面板内,子元素根据其行/列分配进行测量和排列。图像控件可以默认位于中间。但cornerPoints的square是相对于背景图片左上角的坐标,因此margin计算cornerPoints可能是错误的。 Canvas适合您的方案。因此,请检查您是否使用了用于排列图像控件的Image控件的父容器,例如StackPanelGrid。更多详情请参阅Layout panels