L_FindCandidateFormFields (original) (raw)
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
- LTIMGCOR
- For a listing of the exact DLLs and Libraries needed, based on the toolkit version, refer to Files To Be Included With Your Application
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;
}