【发布时间】:2020-07-20 10:29:12
【问题描述】:
我正在使用 JavaFX 创建桌面应用程序,它允许您从网络摄像头扫描二维码。
我决定选择 JavaCV 来处理网络摄像头捕获。然而,问题在于CanvasFrame 类创建了一个Swing JFrame。我的主要目标是找到将它与 JavaFX 组件集成的最佳方式。
我的问题是是否可以在 JPanel(或其他 Swing/JavaFx 组件)中创建 CanvasFrame,而不是在 JFrame 中。在这个选项中,我会将JPanel 包装成SwingNode - 它解决了我的集成问题。
在我的情况下,我还要求其他解决 JavaFX 与 JavaCV 集成问题的建议。 也许有一种直接的方法可以将相机屏幕嵌入到 JavaFx 组件中。
我在下面粘贴测试代码。我的代码是用kotlin写的,但是不影响问题:
import com.google.zxing.*
import com.google.zxing.client.j2se.BufferedImageLuminanceSource
import com.google.zxing.common.HybridBinarizer
import org.bytedeco.javacv.*
import java.awt.image.BufferedImage
import java.util.*
import java.util.concurrent.Executors
class Test {
companion object {
@JvmStatic
fun main(args: Array<String>) {
Executors.newSingleThreadExecutor().execute { testWebcam() }
}
private fun testWebcam() {
val grabber: OpenCVFrameGrabber = OpenCVFrameGrabber(0);
val canvasFrame: CanvasFrame = CanvasFrame("Cam")
grabber.start()
while (canvasFrame.isVisible) {
val frame: Frame = grabber.grabFrame() ?: break
canvasFrame.showImage(frame)
decodeQrCode(grabber)
}
}
private fun decodeQrCode(grabber: OpenCVFrameGrabber) {
val java2DFrameConverter: Java2DFrameConverter = Java2DFrameConverter()
val frame: Frame = grabber.grabFrame()
val image = java2DFrameConverter.getBufferedImage(frame)
val decodedQr = parseQr(image)
println(decodedQr)
}
private fun parseQr(image: BufferedImage): String? {
val reader: MultiFormatReader = MultiFormatReader()
val binaryBitmap: BinaryBitmap =
BinaryBitmap(HybridBinarizer(BufferedImageLuminanceSource(image)))
val hints: Hashtable<DecodeHintType, Any> = Hashtable()
hints[DecodeHintType.CHARACTER_SET] = "UTF-8"
hints[DecodeHintType.POSSIBLE_FORMATS] = listOf(BarcodeFormat.QR_CODE)
return try {
reader.decode(binaryBitmap, hints).text
} catch (e: NotFoundException) {
null;
}
}
}
}
【问题讨论】:
标签: swing kotlin javafx qr-code javacv