L_FindCandidateFormFields

Summary

Extracts the candidate form fields from a bitmap using various options.

There are two major types of fields: Text fields and OMR fields.

Syntax

#include "l_bitmap.h"

L_LTIMGCOR_API L_INT L_FindCandidateFormFields(pBitmap, pOptions, pOutputs)

Parameters

pBITMAPHANDLE pBitmap

Pointer to the bitmap handle that references the bitmap to be processed.

FIND_CANDIDATE_FORM_FIELDS_OPTIONS *pOptions

Fields detection options. This value cannot be null.

FIND_CANDIDATE_FORM_FIELDS_OUTPUTS *pOutputs

Pointer to be updated with the extracted fields.

Returns

Value Meaning
SUCCESS The function was successful.
< 1 An error occurred. Refer to Return Codes.

Comments

Deskew the image first, if it is skewed.

L_FindCandidateFormFields Supports 8-bit, 12-bit and 16-bit grayscale images, and supports 24-bit, 32-bit, 48-bit and 64-bit colored images.

L_FindCandidateFormFields does not support setting rectangle region.

L_FindCandidateFormFields does not support 32-bit grayscale images. It returns the error code ERROR_GRAY32_UNSUPPORTED if a 32-bit grayscale image is passed to this function.

Required DLLs and Libraries

Platforms

Win32, x64, Linux.

See Also

Functions

Example

Extracts the candidate form fields from a bitmap using various options.

L_INT FindCandidateFormFieldsExample(L_VOID) 
{ 
   L_INT nRet = SUCCESS; 
 
   BITMAPHANDLE InputBitmap = { 0 }; 
   FIND_CANDIDATE_FORM_FIELDS_OPTIONS Options; 
   FIND_CANDIDATE_FORM_FIELDS_OUTPUTS Outputs; 
 
   COLORREF red = RGB(255, 0, 0); 
   COLORREF cyan = RGB(0, 255, 255); 
   COLORREF blue = RGB(0, 0, 255); 
   COLORREF green = RGB(0, 255, 0); 
 
   Options.uVerticalLineMinimumLength = 3; 
   Options.uHorizontalLineMinimumLength = 10; 
   Options.uStructSize = sizeof(FIND_CANDIDATE_FORM_FIELDS_OPTIONS); 
 
   L_TCHAR szBuffer1[100]; 
   wsprintf(szBuffer1, MAKE_IMAGE_PATH(L_TEXT("Forms\\Forms to be Recognized\\OMR\\AnswerSheet_Pattern.jpg"))); 
   nRet = L_LoadBitmap(szBuffer1, &InputBitmap, sizeof(BITMAPHANDLE), 0, ORDER_BGRORGRAY, NULL, NULL); 
 
   nRet = L_FindCandidateFormFields(&InputBitmap, &Options, &Outputs); 
   if (nRet != SUCCESS) 
   { 
      goto cleanup; 
   } 
 
   L_HDC hDC = NULL; 
   HPEN  hPen = NULL; 
 
   // Normalize drawing 
   if (InputBitmap.ViewPerspective != TOP_LEFT) 
   { 
      nRet = L_ChangeBitmapViewPerspective(&InputBitmap, &InputBitmap, sizeof(BITMAPHANDLE), TOP_LEFT); 
      if (nRet != SUCCESS) 
         goto cleanup; 
   } 
 
   if (InputBitmap.BitsPerPixel != 24) 
   { 
      nRet = L_ColorResBitmap(&InputBitmap, &InputBitmap, sizeof(BITMAPHANDLE), 24, CRF_BYTEORDERBGR, NULL, NULL, 0, NULL, NULL); 
      if (nRet != SUCCESS) 
         goto cleanup; 
   } 
 
   // Start drawing on the image 
   hDC = L_CreateLeadDC(&InputBitmap); 
   if (hDC == NULL) 
      goto cleanup; 
 
   // No fill 
   SelectObject(hDC, GetStockObject(NULL_BRUSH)); 
 
   for (L_UINT i = 0; i < Outputs.TextFields.uCount; i++) 
   { 
      RECT rect = Outputs.TextFields.pTextFieldAreas[i].rcBounds; 
      COLORREF color = (Outputs.TextFields.pTextFieldAreas[i].uFieldType == TEXT_FIELD_TYPE_BOX) ? cyan : blue; 
      hPen = CreatePen(PS_SOLID, 2, color); 
      if (hPen == NULL) 
         goto cleanup; 
 
      SelectObject(hDC, hPen); 
 
      Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom); 
      DeleteObject(hPen); 
 
      rect = Outputs.TextFields.pTextFieldAreas[i].rcFilledAreaBounds; 
      color = red; 
 
      DeleteObject(hPen); 
      hPen = CreatePen(PS_SOLID, 2, color); 
      if (hPen == NULL) 
         goto cleanup; 
 
      SelectObject(hDC, hPen); 
 
      Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom); 
      DeleteObject(hPen); 
   } 
 
   COLORREF color = green; 
   hPen = CreatePen(PS_SOLID, 2, color); 
   if (hPen == NULL) 
      goto cleanup; 
 
   SelectObject(hDC, hPen); 
 
   for (L_UINT i = 0; i < Outputs.OMRFields.uCount; i++) 
   { 
      RECT rect = Outputs.OMRFields.pOMRFieldAreas[i].rcUnfilledBound; 
      if (Outputs.OMRFields.pOMRFieldAreas[i].uFieldType == OMR_FIELD_TYPE_BOX) 
      { 
         Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom); 
      } 
      else 
      { 
         Ellipse(hDC, rect.left, rect.top, rect.right, rect.bottom); 
      } 
   } 
 
   //////////////////////////////////////////////////////////// 
 
cleanup: 
   if (hPen != NULL) 
      DeleteObject(hPen); 
 
   if (hDC != NULL) 
      L_DeleteLeadDC(hDC); 
 
   // Free the loaded images  
   if (InputBitmap.Flags.Allocated) 
      L_FreeBitmap(&InputBitmap); 
 
   // Free the results  
   L_FindCandidateFormsFieldsFree(&Outputs); 
 
   return nRet; 
} 

Help Version 23.0.2024.2.29
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2024 LEAD Technologies, Inc. All Rights Reserved.

LEADTOOLS Raster Imaging C API Help
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2023 LEAD Technologies, Inc. All Rights Reserved.