我们如何对使用手机摄像头捕获的条码进行编程读取?例如,如何使用 iPhone、Android 或 Java ME 来做到这一点?我们是否需要单独的硬件来读取条形码或者我们可以进行图像处理?
6 回答
Google通过他们的Zebra Crossing库让这一切变得非常简单。他们支持在以下平台上通过图像进行扫描:
- J2SE
- 安卓
和其他人已经移植到:
- J2ME
- 夏普
- CPP
- 轮缘
- 苹果手机
- 漏洞
正如另一张海报已经提到的那样,在 Android 上,您还可以使用Intent调用 Barcode Reader,例如:
public Button.OnClickListener mScan = new Button.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.putExtra("SCAN_MODE", "ONE_D_MODE");
startActivityForResult(intent, 0);
}
};
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = intent.getStringExtra("SCAN_RESULT");
String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
// Handle successful scan
} else if (resultCode == RESULT_CANCELED) {
// Handle cancel
}
}
}
条形码可以通过手机摄像头的分析来读取。
一个众所周知的复杂情况是,定焦相机(如旧款 2G/3G iPhone 和一些 Android 手机)无法在短距离内拍摄对焦快照。为了解决这个问题,必须使用特殊的“反卷积”算法——上次我检查这不是斑马线的一部分。
有些人已经实施了解决方案——我知道以下适用于 iPhone 的应用程序可以使用定焦摄像头读取 UPC:pic2shop(Benoit Maison / Vision Smarts)、RedLaser(Occipital)和 ShopSavvy(日本的 Big)——检查一下,我认为他们都为感兴趣的第 3 方提供了可用的 SDK。
对于安卓来说,这很容易。只需使用 Barcode Scanner 应用程序提供的服务(依赖)。然后条形码扫描仪应用程序将处理所有扫描部分,并将简单地返回您的代码。
我认为类似的解决方案可用于其他平台,但在 Android 中,由于其 Intent 架构,它更容易。
我建议选择一种还可以解码模糊图像中的条形码的解决方案。有许多低端 Android 手机只有定焦摄像头,并且需要比上面列出的软件解决方案提供的二进制阈值更复杂的图像处理解决方案。此类更高级解决方案的示例包括 redlaser 或Scandit 条码扫描器 SDK。
Scandit SDK 非常易于集成,并带有免费的社区版本。还有一个产品 API,可以直接将条形码编号转换为产品名称。
免责声明:我是 Scandit 的联合创始人之一。
显然,可以从它的图像中读取条形码。您可能需要考虑以下问题
- 方向; 也许照片不是直立的,所以条不是垂直的。另外,它可能是颠倒的......
- 重点; 如果镜头模糊怎么办?可能有一个限制,无法安全地解释它。
- 裁剪;如果框架不好,所以整个代码甚至不在图像中怎么办?
有很多现有的项目和产品可以解决这个问题……例如,这里有一个。一些解决方案似乎对上述点不太敏感,但声称能够找到并识别条形码,而不管图像中的方向和位置如何。
只是为了向所有寻求此问题答案的新手更新,Google 现在通过 Google Play 服务提供条形码检测 API,以简化使用手机摄像头扫描条形码的过程。不再需要依赖第三方 API。