日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android基于OpenCV實現QR二維碼檢測

瀏覽:39日期:2022-09-18 08:23:02
目錄QR二維碼QR二維碼格式QR二維碼結構APIQRCodeDetector類結構檢測QR二維碼識別QR二維碼檢測并識別QR二維碼操作結果源碼QR二維碼

QR碼(英語:Quick Response Code;全稱為快速響應矩陣圖碼)是二維碼的一種,于1994年由日本DENSO WAVE公司發明。QR來自英文Quick Response的縮寫,即快速反應,因為發明者希望QR碼可以快速解碼其內容。QR碼使用四種標準化編碼模式(數字、字母數字、字節(二進制)和日文(Shift_JIS))來存儲數據。QR碼常見于日本,為目前日本最通用的二維空間條碼,在世界各國廣泛運用于手機讀碼操作。QR碼比普通一維條碼具有快速讀取和更大的存儲資料容量,也無需要像一維條碼般在掃描時需要直線對準掃描儀。因此其應用范圍已經擴展到包括產品跟蹤,物品識別,文檔管理,庫存營銷等方面?!揪S基百科】

QR二維碼格式

QR碼呈正方形,常見的是黑白兩色。在3個角落,印有較小,像“回”字的正方圖案。這3個是幫助解碼軟件定位的圖案,用戶不需要對準,無論以任何角度掃描,資料仍然可以正確被讀取。日本QR碼的標準JIS X 0510在1999年1月發布,而其對應的ISO國際標準ISO/IEC18004,則在2000年6月獲得批準。根據Denso Wave公司的網站資料,QR碼是屬于開放式的標準,QR碼的規格公開,雖由Denso Wave公司持有的專利權益,但不會被運行。除了標準的QR碼之外,也存在一種稱為“微型QR碼”的格式,是QR碼標準的縮小版本,主要是為了無法處理較大型掃描的應用而設計。微型QR碼同樣有多種標準,最高可存儲35個字符?!揪S基百科】

QR二維碼結構

QR碼最大特征為其左上,右上,左下三個大型的如同“回”字的黑白間同心方圖案,為QR碼識別定位標記,失去其中一個會影響識別。而呈棋盤般分布的有別與大定位標記的較小的同心方則為其校正標記,用于校正識別,版本1沒有校正標記,版本2在右下方,其中心點在左下和右上定位標記的外邊框的相交點,版本10開始以每個等距的方式出現在右下校正點至左下和右上定位標記的外邊框的連線、左上與左下定位標記的外邊框的連線、左上與右上定位標記的外邊框的連線之間、這四邊線上等距點對邊相連線,版本10等距有1個,版本25為3個,版本40為5個。【維基百科】

APIQRCodeDetector類結構

Android基于OpenCV實現QR二維碼檢測

檢測QR二維碼

public boolean detect(Mat img, Mat points) 參數一:img,待檢測是否含有QR二維碼的的灰度圖或者彩色(BGR)圖像。 參數二:points,檢測到的QR二維碼的最小區域四邊形的4個頂點坐標集合。 返回值:布爾類型,true,代表檢測到QR二維碼;false,代表未檢測到QR二維碼。

public boolean detectMulti(Mat img, Mat points) 參數一:img,待檢測是否含有QR二維碼的的灰度圖或者彩色(BGR)圖像。 參數二:points,多個檢測結果QR二維碼的最小區域四邊形的4個頂點坐標集合。 返回值:布爾類型,true,代表檢測到QR二維碼;false,代表未檢測到QR二維碼。識別QR二維碼

public String decode(Mat img, Mat points, Mat straight_qrcode) 參數一:img,含有QR二維碼的灰度圖像或者彩色(BGR)圖像。 參數二:points,detect方法得到的points值。數據量不可為空。 參數三:straight_qrcode,經過矯正和二值化的QR二維碼?!究蛇x參數】 返回值:字符串類型,如果解碼失敗,則為空串。

public boolean decodeMulti(Mat img, Mat points, List<String> decoded_info, List<Mat> straight_qrcode) 參數一:img,含有QR二維碼的灰度圖像或者彩色(BGR)圖像。 參數二:points,detect方法得到的points值。數據量不可為空。 參數三:decoded_info,多個二維碼的解碼信息。 參數四:straight_qrcode,所有檢測到的二維碼矯正和二值化的后的結果集合?!究蛇x參數】 返回值:布爾類型,true,代表解碼成功,反之,解碼失敗。 檢測并識別QR二維碼

public String detectAndDecode(Mat img, Mat points, Mat straight_qrcode) 參數一:img,含有QR二維碼的灰度圖像或者彩色(BGR)圖像。 參數二:points,檢測到的QR二維碼的最小區域四邊形的4個頂點坐標。 參數三:straight_qrcode,經過矯正和二值化的QR二維碼。【可選參數】 返回值:字符串類型,如果解碼失敗,則為空串。

public boolean detectAndDecodeMulti(Mat img, List<String> decoded_info, Mat points, List<Mat> straight_qrcode) 參數一:img,含有QR二維碼的灰度圖像或者彩色(BGR)圖像。 參數二:decoded_info,多個二維碼的解碼信息。 參數三:points,檢測到的多個QR二維碼的最小區域四邊形的4個頂點坐標集合。【可選參數】 參數四:straight_qrcode,所有檢測到的二維碼矯正和二值化的后的結果集合?!究蛇x參數】 返回值:字符串類型,如果解碼失敗,則為空串。 操作

/** * QR二維碼檢測 * author: yidong * 2020/10/27 */class QRDetectActivity : AppCompatActivity() { private lateinit var mBinding: ActivityQrDetectBinding private lateinit var mQRCodeDetector: QRCodeDetector private var mPhotoSavePath = '' private lateinit var mUri: Uri private lateinit var mSource: Mat private lateinit var mGray: Mat private lateinit var mOperationSheet: BottomSheetDialog private lateinit var mSheetBinding: LayoutQrDetectOpBinding private lateinit var mPhotoSheet: BottomSheetDialog private lateinit var mPhotoOpBinding: LayoutPhotoOpBinding // 請求相機權限 private val requestCameraPermission =registerForActivityResult(ActivityResultContracts.RequestPermission()) { if (it) {mPhotoSavePath = cacheDir.path + File.separator + '${System.currentTimeMillis()}.png'mUri = MediaStoreUtils.getIntentUri(this, File(mPhotoSavePath))requestCamera.launch(mUri) } else {Toast.makeText(applicationContext, '無相機權限', Toast.LENGTH_SHORT).show() }} // 請求外部存儲權限 private val requestStoragePermission =registerForActivityResult(ActivityResultContracts.RequestPermission()) { if (it) {pickImage.launch('image/*') } else {Toast.makeText(applicationContext, '無存儲權限', Toast.LENGTH_SHORT).show() }} private val requestCamera = registerForActivityResult(ActivityResultContracts.TakePicture()) {if (it) { val bgr = Imgcodecs.imread(mPhotoSavePath, Imgcodecs.IMREAD_COLOR) if (bgr.empty()) {Toast.makeText(applicationContext, '讀取拍照結果失敗', Toast.LENGTH_SHORT).show()return@registerForActivityResult } else {Imgproc.cvtColor(bgr, mSource, Imgproc.COLOR_BGR2RGB)Imgproc.cvtColor(bgr, mGray, Imgproc.COLOR_BGR2GRAY)mBinding.ivLena.showMat(mSource) }} else { Toast.makeText(applicationContext, '拍照失敗', Toast.LENGTH_SHORT).show()} } private val pickImage = registerForActivityResult(ActivityResultContracts.GetContent()) {if (it != null) { val filePath = MediaStoreUtils.getMediaPath(this, it) if (filePath.isNullOrEmpty()) {Toast.makeText(applicationContext, '讀取圖片失敗', Toast.LENGTH_SHORT).show()return@registerForActivityResult } val bgr = Imgcodecs.imread(filePath, Imgcodecs.IMREAD_COLOR) if (bgr.empty()) {Toast.makeText(applicationContext, '讀取圖片失敗', Toast.LENGTH_SHORT).show()return@registerForActivityResult } else {Imgproc.cvtColor(bgr, mSource, Imgproc.COLOR_BGR2RGB)Imgproc.cvtColor(bgr, mGray, Imgproc.COLOR_BGR2GRAY)mBinding.ivLena.showMat(mSource) }} else { Toast.makeText(applicationContext, '選圖失敗', Toast.LENGTH_SHORT).show()} } override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)mBinding = DataBindingUtil.setContentView(this, R.layout.activity_qr_detect)mQRCodeDetector = QRCodeDetector()mSource = Mat()mGray = Mat()val bgr = Utils.loadResource(this, R.drawable.qrcode)Imgproc.cvtColor(bgr, mSource, Imgproc.COLOR_BGR2RGB)Imgproc.cvtColor(bgr, mGray, Imgproc.COLOR_BGR2GRAY)mBinding.ivLena.showMat(mSource)createDialog() } private fun createDialog() {mOperationSheet = BottomSheetDialog(this)mSheetBinding = LayoutQrDetectOpBinding.inflate(layoutInflater, null, false)mOperationSheet.setContentView(mSheetBinding.root)mSheetBinding.tvDetect.setOnClickListener { mOperationSheet.dismiss() doDetect()}mSheetBinding.tvDecode.setOnClickListener { mOperationSheet.dismiss() doDecode()}mPhotoSheet = BottomSheetDialog(this)mPhotoOpBinding = LayoutPhotoOpBinding.inflate(layoutInflater, null, false)mPhotoSheet.setContentView(mPhotoOpBinding.root)mPhotoOpBinding.tvCamera.setOnClickListener { mPhotoSheet.dismiss() requestCameraPermission.launch(Manifest.permission.CAMERA )}mPhotoOpBinding.tvPhoto.setOnClickListener { mPhotoSheet.dismiss() requestStoragePermission.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE )} } private fun doDetect() {val points = Mat()val isHasQr = mQRCodeDetector.detect(mSource, points)if (isHasQr) { val pointArr = FloatArray(8) points.get(0, 0, pointArr) Log.d(App.TAG, pointArr.toList().toString()) val tmp = mSource.clone() for (i in pointArr.indices step 2) {val start = Point(pointArr[i % 8].toDouble(), pointArr[(i + 1) % 8].toDouble())val end = Point(pointArr[(i + 2) % 8].toDouble(), pointArr[(i + 3) % 8].toDouble())Imgproc.line(tmp, start, end, Scalar(255.0, 0.0, 0.0), 8, Imgproc.LINE_8) } mBinding.ivResult.showMat(tmp) tmp.release()} } private fun doDecode() {val points = Mat()val isHasQr = mQRCodeDetector.detect(mGray, points)if (isHasQr) { val result = mQRCodeDetector.decode(mGray, points) if (result.isEmpty()) {Toast.makeText(applicationContext, '無法解碼', Toast.LENGTH_SHORT).show() } else {Snackbar.make(mBinding.root, '解碼結果:$result', 3000).show() } Log.d(App.TAG, result)} else { Toast.makeText(applicationContext, '未檢測到QRCode', Toast.LENGTH_SHORT).show()} } private fun selectMedia() {if (this::mPhotoSheet.isInitialized) { mPhotoSheet.show()} } private fun selectOps() {if (this::mOperationSheet.isInitialized) { mOperationSheet.show()} } override fun onCreateOptionsMenu(menu: Menu?): Boolean {menuInflater.inflate(R.menu.menu_qr_detect, menu)return true } override fun onOptionsItemSelected(item: MenuItem): Boolean {when (item.itemId) { R.id.menu_pick_photo -> selectMedia() R.id.menu_qr_ops -> selectOps()}return true } override fun onDestroy() {mSource.release()mGray.release()super.onDestroy() }}結果

Android基于OpenCV實現QR二維碼檢測

源碼

github.com/onlyloveyd/…

以上就是Android基于OpenCV實現QR二維碼檢測的詳細內容,更多關于Android OpenCV實現QR二維碼檢測的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品亚洲一区二区三区免费| 久久精品青草| 日韩在线中文| 日韩视频在线一区二区三区 | 日韩精品久久久久久| 国产一区二区三区久久 | 国产精品99久久免费观看| 麻豆精品蜜桃视频网站| 樱桃视频成人在线观看| 日本欧美不卡| 免费日韩av片| 久久久久九九精品影院| 99久久99久久精品国产片果冰| 久久亚洲精品伦理| 国产精品qvod| 中文精品在线| 国产精久久一区二区| 久久久噜噜噜| 国产日韩欧美一区二区三区在线观看| 成人免费一区| 亚洲三级毛片| 日韩成人高清| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲欧美视频| 国产精品普通话对白| 久久激情五月婷婷| 激情五月综合网| 国产精品尤物| 黄色日韩在线| 日本欧美在线| 最新日韩av| 国内亚洲精品| 国产精品99一区二区三| 涩涩涩久久久成人精品| 婷婷成人在线| 精品亚洲a∨| 国产精品一区亚洲| 亚洲精品大片| 欧美专区一区二区三区| 日韩一区三区| 精品三区视频| 国产精品日本一区二区不卡视频| 蜜臀久久99精品久久久久宅男| 精品视频自拍| 国产精品片aa在线观看| 深夜福利亚洲| 少妇精品久久久| 国产精品1luya在线播放| 久久国产成人午夜av影院宅| 在线日韩欧美| 精品一区二区三区免费看| 欧美精品影院| 久久aⅴ国产紧身牛仔裤| 婷婷综合社区| 大香伊人久久精品一区二区| 日韩一区二区三区精品 | 另类中文字幕国产精品| 欧美一区91| 亚洲影院天堂中文av色| 日韩国产一区二区| 久久中文字幕一区二区三区| 国产精品一区二区av交换| 一区福利视频| 久久国产毛片| 久久国产直播| 999国产精品999久久久久久| 久久久久亚洲| 亚洲成人精品| 麻豆成人在线| 日韩在线一二三区| 国产综合激情| 中文字幕一区久| 精品欠久久久中文字幕加勒比| 精品一区二区三区中文字幕视频 | 欧美日韩精品一本二本三本| 中文字幕成人| 久久国产尿小便嘘嘘| 久久国产精品美女| 欧美激情日韩| 国精品产品一区| 久久久久久一区二区| 色综合www| 日本亚洲视频在线| 久久不见久久见免费视频7| 欧美日韩一区二区三区四区在线观看 | 国产麻豆一区二区三区精品视频| 7777精品| 国产aⅴ精品一区二区四区| 精品欧美日韩精品| 久久久精品网| 亚洲我射av| 欧美日韩亚洲一区三区| 国产精品亚洲综合色区韩国| 国产一区二区三区精品在线观看| 鲁鲁在线中文| 亚洲黄页一区| 欧美日韩a区| 色综合www| 日本精品一区二区三区在线观看视频| 国产日韩一区二区三免费高清| 成人一区而且| 亚洲综合小说| 日韩欧美精品一区| 亚洲精品在线a| 香蕉精品视频在线观看| 久久国产尿小便嘘嘘| 日本成人精品| 在线一区电影| 国产麻豆精品| 三级欧美在线一区| se01亚洲视频| 欧美视频久久| 婷婷综合在线| 美女网站视频一区| 国产精品99一区二区三| 日韩中文字幕视频网| 美女网站一区| 美女少妇全过程你懂的久久| 国产成人精品一区二区三区视频 | 欧美视频久久| 99xxxx成人网| 色一区二区三区| 欧美日韩一区二区三区四区在线观看| 亚洲欧美一区在线| 久久免费精品| 日韩不卡一区二区三区 | se01亚洲视频 | 亚洲人成精品久久久| 免费观看久久av| 伊人国产精品| 日韩精品视频在线看| 久久国产高清| 99视频精品全部免费在线视频| 亚洲激情另类| 六月婷婷综合| 国产传媒在线| 狠狠爱成人网| 黄色亚洲在线| 国产精品资源| 伊人久久国产| 国产精品一区二区免费福利视频| 国产一区二区三区自拍| 日韩一区二区在线免费| 国产精品一区二区三区www| 国产精品美女久久久| 久久超碰99| 日韩在线一区二区| 日韩欧美二区| 麻豆精品在线观看| 日韩中文字幕91| 久久久久中文| 国产精品三p一区二区| 999久久久91| 国产精品夜夜夜| 视频国产精品| 日韩视频二区| 亚洲国产不卡| 国产一区二区三区成人欧美日韩在线观看| 国产一级久久| 在线综合亚洲| 国产精品13p| 日韩va欧美va亚洲va久久| 成午夜精品一区二区三区软件| 亚州av乱码久久精品蜜桃| 日韩1区2区日韩1区2区| 日韩亚洲国产欧美| 国户精品久久久久久久久久久不卡| 色综合狠狠操| 欧美激情另类| 亚洲1234区| 亚洲国产日韩欧美在线| 久久av在线| 精品国产中文字幕第一页| 蜜臀av性久久久久蜜臀aⅴ四虎| 四虎成人av| 国产精品一页| 日韩一区精品| 午夜在线一区| 婷婷成人在线| 久久亚洲在线| 中文字幕系列一区| 精品国产午夜| 国产精品蜜月aⅴ在线| 蜜臀av性久久久久蜜臀aⅴ流畅 | 午夜免费一区| 中文字幕在线看片| 国产精品igao视频网网址不卡日韩 | 日韩影院在线观看| 亚洲性视频h| 欧美三区四区| 米奇777超碰欧美日韩亚洲| 日韩毛片视频| 亚洲日本网址| 精品欠久久久中文字幕加勒比| 日韩区一区二| 日韩福利视频导航| 欧美视频久久| 精品视频在线你懂得| 国产一区二区三区国产精品| 精品国产欧美|