diff --git a/camera_server/modules/image_processors/QrCodeDetector.cpp b/camera_server/modules/image_processors/QrCodeDetector.cpp index ea80dd87..c96c3d98 100644 --- a/camera_server/modules/image_processors/QrCodeDetector.cpp +++ b/camera_server/modules/image_processors/QrCodeDetector.cpp @@ -8,9 +8,8 @@ QrCodeDetector::QrCodeDetector() { - detector.setEpsX(0.2); // 水平方向のファインダパターン探索の許容誤差指定 - detector.setEpsY(0.2); // 垂直方向のファインダパターン探索の許容誤差指定 - options.setFormats(ZXing::BarcodeFormat::QRCode); // QRコードのみを検出 + options.setFormats(ZXing::BarcodeFormat::QRCode); + options.setTryHarder(true); LOG_CREATE("QrCodeDetector"); } @@ -28,48 +27,22 @@ QrCodeDetectionResult QrCodeDetector::detect(const cv::Mat& frame) return result; } - // QRコードの各頂点の位置を検出 - std::vector corners; - if(!detector.detect(frame, corners) || corners.size() != 4) { - return result; - } - - // 透視変換で正面化 - cv::Mat rectifiedFrame = rectify(frame, corners); + // 入力画像からZXing用のImageViewを生成 + ZXing::ImageView iv(frame.data, frame.cols, frame.rows, ZXing::ImageFormat::BGR, + static_cast(frame.step)); - // 正面化したフレームをデコード - ZXing::ImageView iv(rectifiedFrame.data, rectifiedFrame.cols, rectifiedFrame.rows, - ZXing::ImageFormat::BGR, static_cast(rectifiedFrame.step)); + // 入力画像からQRコードを検出し、デコード結果を取得 auto qrCode = ZXing::ReadBarcode(iv, options); - if(qrCode.isValid()) { - result.wasDetected = true; - result.content = qrCode.text(); - for(int i = 0; i < 4; ++i) { - result.corners[i] = corners[i]; - } + // QRコードが検出できなかった場合は終了 + if(!qrCode.isValid()) { + Logger::error("ZXing detect + decode failed"); + return result; } - return result; -} -cv::Mat QrCodeDetector::rectify(const cv::Mat& frame, const std::vector& corners) const -{ - // 対辺の長さの最大値を正方形の一辺とする - float maxWidth = std::max(cv::norm(corners[1] - corners[0]), cv::norm(corners[2] - corners[3])); - float maxHeight = std::max(cv::norm(corners[3] - corners[0]), cv::norm(corners[2] - corners[1])); - float outputQrSize = std::max(maxWidth, maxHeight); - // クワイエットゾーン(余白)を追加する - float quietZoneSize = outputQrSize * quietZoneRatio; - int outputSize = static_cast(outputQrSize + 2.f * quietZoneSize); + // 検出結果を保存 + result.wasDetected = true; + result.content = qrCode.text(); - // 余白分だけ内側にQRコード領域を配置 - std::vector dstCorners - = { { quietZoneSize, quietZoneSize }, - { quietZoneSize + outputQrSize, quietZoneSize }, - { quietZoneSize + outputQrSize, quietZoneSize + outputQrSize }, - { quietZoneSize, quietZoneSize + outputQrSize } }; - cv::Mat pixelNum = cv::getPerspectiveTransform(corners, dstCorners); - cv::Mat rectifiedFrame; - cv::warpPerspective(frame, rectifiedFrame, pixelNum, cv::Size(outputSize, outputSize)); - return rectifiedFrame; -} + return result; +} \ No newline at end of file diff --git a/camera_server/modules/image_processors/QrCodeDetector.h b/camera_server/modules/image_processors/QrCodeDetector.h index 653b3502..d3ab8c79 100644 --- a/camera_server/modules/image_processors/QrCodeDetector.h +++ b/camera_server/modules/image_processors/QrCodeDetector.h @@ -9,12 +9,11 @@ #include #include -#include #include #include #include "CodeDetector.h" -#include "QrCodeDetectionResult.h" #include "Logger.h" +#include "QrCodeDetectionResult.h" class QrCodeDetector : public CodeDetector { public: @@ -29,24 +28,14 @@ class QrCodeDetector : public CodeDetector { ~QrCodeDetector(); /** - * @brief フレーム内のQRコードを検出する + * @brief フレーム内のQRコードを検出・デコードする * @param frame 処理対象のフレーム - * @return 検出結果(QrCodeDetectionResult型) + * @return 検出結果 */ QrCodeDetectionResult detect(const cv::Mat& frame) override; private: - static constexpr float quietZoneRatio = 0.2f; // 透視変換後のクワイエットゾーン比率 - cv::QRCodeDetector detector; // OpenCVのQRコード検出器 - ZXing::ReaderOptions options; // ZXingのデコードオプション - - /** - * @brief 検出したQRコードの各頂点の座標から透視変換でQRコード領域を正面化する - * @param frame 処理対象のフレーム - * @param corners 検出したQRコードの各頂点の座標 - * @return 正面化したQRコード領域のフレーム - */ - cv::Mat rectify(const cv::Mat& frame, const std::vector& corners) const; + ZXing::ReaderOptions options; // ZXingのデコードオプション }; -#endif // QR_CODE_DETECTOR_H +#endif // QR_CODE_DETECTOR_H \ No newline at end of file