C#.NET을 사용하는 OMR 스캐너 소프트웨어

OMR(Optical Mark Recognition)은 특수한 유형의 문서 형식에 표시된 데이터를 캡처하고 분석하는 자동화된 프로세스입니다. 이 특별한 유형의 문서는 설문조사 양식, 시험지 및 기타 종이 문서에 사람들이 표시/채울 수 있습니다. 이 기사에서는 C#을 사용하여 GUI 기반 OMR 시트 리더 애플리케이션을 개발하는 방법을 배웁니다. 우리의 솔루션은 스캔한 OMR 시트 이미지를 로컬 디스크의 입력으로 가져온 다음 마크를 인식하고 마지막으로 표시된 등록 번호와 음영 처리된 답변을 CSV 형식으로 내보냅니다. 언급된 단계를 수행하면 .NET에서 C# OMR(광학 마크 인식) 소프트웨어를 갖게 됩니다. 시작하겠습니다.

이 기사에서는 다음 주제를 다룹니다.

  1. C# OMR(Optical Mark Recognition) 소프트웨어의 특징
  2. C# 광학 마크 인식 .NET API 및 UI 제어
  3. OMR 소프트웨어 개발 단계
  4. C# 광학 마크 인식(OMR) 소프트웨어 데모
  5. OMR 소프트웨어 소스 코드 다운로드

C# 광학 마크 인식(OMR) 소프트웨어의 기능

당사의 OMR(광학 마크 인식) 소프트웨어에는 다음과 같은 기능이 있습니다.

  1. 대화식으로 인식 매개변수를 조정하고 그 효과를 실시간으로 관찰합니다. 다음을 조정할 수 있습니다.
    • 인식 임계값
    • 말풍선 표시/숨기기
  2. 다음 형식으로 스캔한 이미지를 선택하고 로드합니다.
  3. 이미지의 광학 표시를 인식합니다.
  4. 결과를 CSV로 내보내고 로컬 디스크에 저장합니다.

C# 광학 마크 인식 .NET API 및 UI 제어

Aspose.OMR for .NET API를 사용하면 답안지, 테스트, MCQ 논문, 퀴즈, 피드백 양식, 설문조사 및 투표용지를 설계, 생성 및 인식할 수 있습니다. 또한 .NET UI 응용 프로그램에 추가할 수 있는 그래픽 사용자 인터페이스 컨트롤을 제공합니다. OMR 스캐너/리더 애플리케이션을 개발하기 위해 .NET UI 애플리케이션에서 .NET UI 제어용 Aspose.OMR을 통합합니다. API의 DLL을 다운로드하거나 NuGet을 사용하여 설치하십시오.

PM> Install-Package Aspose.OMR

OMR 소프트웨어 개발 단계

다음 단계에 따라 GUI 기반 OMR 스캐너/리더 애플리케이션을 개발할 수 있습니다.

  • 먼저 새 프로젝트를 만들고 WPF App(.NET Framework) 프로젝트 템플릿을 선택합니다.
Create a new project and select the project template.

Create a new project and select the project template.

  • 그런 다음 새 프로젝트 구성 대화 상자에서 프로젝트 이름을 입력하고 위치를 선택한 다음 다른 매개변수를 설정합니다.
WPF 앱 프로젝트 구성

WPF 앱 프로젝트 구성

  • 그런 다음 NuGet 패키지 관리자를 열고 Aspose.OMR for .NET 패키지를 설치합니다.
.NET용 Aspose.OMR 설치

.NET용 Aspose.OMR 설치

  • 다음으로 새 파일 DialogHelper.cs를 프로젝트에 추가합니다.
DialogHelper 클래스 추가

DialogHelper.cs 추가

  • 새로 만든 DialogHelper.cs에 다음 코드를 추가합니다.
internal class DialogHelper
{
    ///<summary>
    /// 템플릿 이미지를 여는 대화 상자의 필터 문자열입니다.
    ///</summary>
    private static readonly string ImageFilesFilterPrompt = "Image files |*.jpg; *.jpeg; *.png; *.gif; *.tif; *.tiff;";

    ///<summary>
    /// 인식 결과를 저장하는 대화 상자의 필터 문자열
    ///</summary>
    private static readonly string DataExportFilesFilterPrompt = "Comma-Separated Values (*.csv)" + " | *.csv";

    ///<summary>
    /// 이미지 파일 열기 대화 상자를 표시합니다.
    ///</summary>
    ///<returns> 선택한 파일의 경로 또는<c> 없는</c> 파일을 선택하지 않은 경우.</returns>
    public static string ShowOpenImageDialog(string suggestedDir = null)
    {
        OpenFileDialog dialog = new OpenFileDialog();
        return ShowDialog(dialog, ImageFilesFilterPrompt, suggestedDir);
    }

    ///<summary>
    /// 인식 결과 파일 저장 대화 상자를 표시합니다.
    ///</summary>
    ///<returns> 선택한 파일의 경로 또는<c> 없는</c> 파일을 선택하지 않은 경우.</returns>
    public static string ShowSaveDataDialog(string suggestedName)
    {
        SaveFileDialog dialog = new SaveFileDialog();
        return ShowDialog(dialog, DataExportFilesFilterPrompt, suggestedName);
    }

    ///<summary>
    /// 주어진 대화 상자를 표시하고 그 결과를 다음으로 반환합니다.<c> 끈</c> .
    ///</summary>
    ///<param name="dialog"> 표시할 대화 상자입니다.</param>
    ///<param name="filter"> 파일 형식 필터 문자열입니다.</param>
    ///<param name="suggestedDir"> 제안된 대화 상자 초기 디렉토리</param>
    ///<param name="suggestedName"> 추천 파일 이름</param>
    ///<returns> 선택한 파일의 경로 또는<c> 없는</c> 파일을 선택하지 않은 경우.</returns>
    private static string ShowDialog(FileDialog dialog, string filter, string suggestedDir = null, string suggestedName = null)
    {
        string fileName = null;

        dialog.Filter = filter;
        dialog.RestoreDirectory = true;
        if (suggestedName != null)
        {
            dialog.FileName = suggestedName;
        }

        if (suggestedDir != null)
        {
            dialog.InitialDirectory = suggestedDir;
        }

        bool? result = dialog.ShowDialog();
        if (result == true)
        {
            fileName = dialog.FileName;
        }

        return fileName;
    }
}
  • 다음으로 MainWindow.xaml 파일을 다음 XAML 콘텐츠로 업데이트합니다.
<Window x:Class="OMR_APP.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:OMR_APP"
        mc:Ignorable="d"
        Title="Aspose OMR Demo" Height="880" Width="1100">
    <Grid Background="WhiteSmoke">
        <Grid.RowDefinitions>
            <RowDefinition Height="40"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>

        <ToolBar Grid.Row="0" Background="LightGray">
            <TextBox Name="txtTemplatePath" Margin="5" Width="400" Height="30" Background="White"
                     HorizontalContentAlignment="Center" VerticalContentAlignment="Center">
            </TextBox>
            <Button  Margin="5" Width="100" Height="30" Background="White"
                     Content="Get control" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
                     Click="GetButtonClicked"/>
            <Separator/>

            <Button  Margin="5" Width="100" Height="30" Background="White"
                     Content="Select Image" Click="SelectImageClicked"/>

            <Button  Margin="5" Width="100" Height="30" Background="White"
                     Content="Recognize Image" Click="RecognizeImageClicked"/>

            <Button  Margin="5" Width="100" Height="30" Background="White"
                     Content="Export Results" Click="ExportResultsClicked"/>
        </ToolBar>

        <ContentControl Grid.Row="1" x:Name="CustomContentControl"
                        HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</Window>
  • 이후 MainWindow.xaml.cs 파일에서 다음 내용을 교체합니다.
///<summary>
/// 테스트용 템플릿
///</summary>
private static readonly string TemplateFilePath = @"C:\Files\OMR\Sheet.omr";

///<summary>
/// 라이선스 Aspose.OMR.NET.lic 파일 경로
///</summary>
private static readonly string LicensePath = @"";

private CorrectionControl control;

public MainWindow()
{
    InitializeComponent();

    // 템플릿 파일 경로 설정 및 표시
    txtTemplatePath.Text = TemplateFilePath;

    // 라이센스 설정, 라이센스 파일 경로 제공 및 전체 결과 테스트를 위한 주석 해제
    //라이선스 lic = new License();
    //lic.SetLicense(라이센스 경로);
}

public string UserImagePath { get; set; }

public string DataFolderPath { get; set; }


///<summary>
/// CorrectionControl 로드 및 표시
///</summary>
private void GetButtonClicked(object sender, RoutedEventArgs e)
{
    string path = txtTemplatePath.Text;

    try
    {
        OmrEngine engine = new OmrEngine();
        TemplateProcessor processor = engine.GetTemplateProcessor(path);

        control = engine.GetCorrectionControl(processor);
        CustomContentControl.Content = control;
        control.Initialize();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message,"Exception");
    }
}

///<summary>
/// 이미지 선택 및 표시 
///</summary>
private void SelectImageClicked(object sender, RoutedEventArgs e)
{
    if (control == null)
    {
        return;
    }

    string imagePath = DialogHelper.ShowOpenImageDialog(this.DataFolderPath);
    if (string.IsNullOrEmpty(imagePath))
    {
        return;
    }

    this.UserImagePath = imagePath;

    control.LoadAndDisplayImage(imagePath);
}

///<summary>
/// 불러온 이미지 인식
///</summary>
private void RecognizeImageClicked(object sender, RoutedEventArgs e)
{
    if (control == null)
    {
        return;
    }

    control.RecognizeImage();
}

///<summary>
/// CSV로 결과 내보내기
///</summary>
private void ExportResultsClicked(object sender, RoutedEventArgs e)
{
    if (control == null)
    {
        return;
    }

    string imageName = Path.GetFileNameWithoutExtension(this.UserImagePath);

    string path = DialogHelper.ShowSaveDataDialog(imageName);
    if (string.IsNullOrEmpty(path))
    {
        return;
    }

    control.ExportResults(path);

    MessageBox.Show("The exported resultant CSV file can be found here : " + path, "Operation Successful");
}
  • 마지막으로 애플리케이션을 실행합니다.

C# 광학 마크 인식(OMR) 소프트웨어 데모

다음은 방금 만든 OMR 스캐너/리더 애플리케이션의 데모입니다.

C# OMR 소프트웨어 데모

OMR 소프트웨어 데모

OMR 소프트웨어 소스 코드 다운로드

GitHub에서 OMR 스캐너 애플리케이션의 전체 소스 코드를 다운로드할 수 있습니다.

무료 라이선스 받기

평가 제한 없이 라이브러리를 사용해 보려면 무료 임시 라이센스를 얻으십시오.

결론

이 기사에서 우리는 방법을 배웠습니다

  • .NET 응용 프로그램에서 .NET UI 제어용 Aspose.OMR을 통합합니다.
  • C#에서 OMR 시트 리더 응용 프로그램을 개발합니다.

또한 문서를 사용하여 .NET API용 Aspose.OMR에 대해 자세히 알아볼 수 있습니다. 모호한 점이 있는 경우 포럼에서 언제든지 문의하십시오.

또한보십시오