c++ - 检测扫描图像所属的相机
问题描述
我正在使用 Leadtools 20 API 来控制扫描仪并扫描一些文档。我有 2 个问题。
1 -与从扫描仪接收图像并不断返回以获取下一个图像L_TwainAcquire
的回调函数一起使用时。SUCCESS
回调函数内部是否有确定图像是来自前置摄像头还是后置摄像头?
2 - 有没有办法强制扫描仪只使用后置摄像头进行扫描?
谢谢
山姆
解决方案
如果您指的是使用双面扫描仪时扫描文档的 2 面,答案如下:
- 要知道位图回调中当前正在处理纸张的哪一面,可以在回调函数内部使用以下代码:
L_INT EXT_CALLBACK LTwainBitmapCallback(HTWAINSESSION hSession, pBITMAPHANDLE pBitmap, L_VOID * pUserData)
{
L_INT nRet = SUCCESS;
TW_EXTIMAGEINFO* pExtImg = NULL;
int nExtraInfoAftreZero = 0; // we have only one info, so no extra needed
pExtImg = (TW_EXTIMAGEINFO *)malloc(sizeof TW_EXTIMAGEINFO + nExtraInfoAftreZero * sizeof TW_INFO);
if (pExtImg)
{
pExtImg->NumInfos = 1;
pExtImg->Info[0].InfoID = TWEI_PAGESIDE;
pExtImg->Info[0].ItemType = TWTY_UINT16;
nRet = L_TwainGetExtendedImageInfo (hSession, pExtImg);
if (nRet == SUCCESS)
{
// Do processing to returned values
if(pExtImg->Info[0].Item == TWCS_TOP)
OutputDebugString("Front of sheet.\n");
else if (pExtImg->Info[0].Item == TWCS_BOTTOM)
OutputDebugString("Rear of sheet.\n");
else
OutputDebugString("Unexpected!\n");
nRet = L_TwainFreeExtendedImageInfoStructure (&pExtImg);
if(nRet != SUCCESS)
return nRet;
}
free(pExtImg);
}
return SUCCESS;
}
- 如Twain Spec中所述,可以使用 CAP_CAMERASIDE 和 CAP_CAMERAENABLED 功能的组合来强制扫描特定的一侧。
引用该文件:
要启用仅底部扫描,请将 CAP_CAMERASIDE 设置为 TWCS_BOTTOM 并将 CAP_CAMERAENABLED 设置为 TRUE,然后将 CAP_CAMERAENABLED 设置为 TWCS_TOP 并将 CAP_CAMERAENABLED 设置为 FALSE。
如果您的意思是您有一台带有 2 个 Twain 相机源(背面和正面)的计算机,则答案如下:
- 要知道哪个 Twain 源(例如相机)在被调用时触发了 Twain Bitmap Callback
L_TwainAcquire()
,您可以使用L_TwainGetSources()
带有LTWAIN_SOURCE_ENUMERATE_DEFAULT
标志的函数来获取当前选择的 Twain 设备。这可以在Bitmap Callback 中完成,如以下代码所示:
// Source Info Callback
L_INT EXT_CALLBACK TwainSourceInfoCallbackCurrent(HTWAINSESSION hSession, pLTWAINSOURCEINFO pSourceInfo, L_VOID * pUserData)
{
strcpy((L_CHAR *)pUserData, pSourceInfo->pszTwnSourceName);
return SUCCESS;
}
// Twain Bitmap Callback
L_INT EXT_CALLBACK LTwainBitmapCallback(HTWAINSESSION hSession, pBITMAPHANDLE pBitmap, L_VOID * pUserData)
{
char szSourceName[1024];
L_TwainGetSources(hSession, TwainSourceInfoCallbackCurrent, sizeof LTWAINSOURCEINFO, LTWAIN_SOURCE_ENUMERATE_DEFAULT, szSourceName);
// Now szSourceName contains name of Twain Source.
return SUCCESS;
}
- 是的,您可以通过在扫描前将其名称发送到函数来强制从特定设备(扫描仪、相机等)进行
L_TwainSelectSource()
扫描,如下所示:
LTWAINSOURCE TwainSource;
TwainSource.uStructSize = sizeof LTWAINSOURCE;
TwainSource.pszTwainSourceName = pszRearCameraTwainSourceName;
L_TwainSelectSource(twainSession, &TwainSource);
// Now L_TwainAcquire() will capture from Rear Camera
要查找所有设备的名称,您可以使用以下代码:
L_TwainGetSources(twainSession, TwainSourceInfoCallback, sizeof LTWAINSOURCEINFO, LTWAIN_SOURCE_ENUMERATE_ALL, NULL);
源信息回调将为每个 Twain 源触发一次。它可以这样实现:
L_INT EXT_CALLBACK TwainSourceInfoCallback(HTWAINSESSION hSession, pLTWAINSOURCEINFO pSourceInfo, L_VOID * pUserData)
{
OutputDebugString(pSourceInfo->pszTwnSourceName); // You can save the names of Twain Sources into global variables if you like
OutputDebugString("\n");
return SUCCESS;
}
推荐阅读
- amazon-web-services - PostgreSQL AWS Cloudwatch 中的无服务器数据库容量是什么?
- html - 如何创建一个带有图像提交按钮的搜索栏
- rust - 使用 transmute 实现可变迭代器以避免与不可变对应物的代码重复是否安全?
- python-3.x - Kmeans - 找到两个集群的两点之间的最近距离
- c# - Unity InputField字符串比较不起作用
- android - android应用程序屏幕顶部的空白,但我不知道为什么(Android)
- c++ - 我在 Clang 和 GCC 中发现错误了吗?
- xcode - 在 xcode 12 beta 中找到主视图控制器
- python - 从其他两列在 Pandas 数据框中创建新列时出错
- javascript - 新反应原生,按钮似乎不能单独工作