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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android基于OpenCV實(shí)現(xiàn)QR二維碼檢測(cè)

瀏覽:38日期:2022-09-18 08:23:02
目錄QR二維碼QR二維碼格式QR二維碼結(jié)構(gòu)APIQRCodeDetector類結(jié)構(gòu)檢測(cè)QR二維碼識(shí)別QR二維碼檢測(cè)并識(shí)別QR二維碼操作結(jié)果源碼QR二維碼

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

QR二維碼格式

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

QR二維碼結(jié)構(gòu)

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

APIQRCodeDetector類結(jié)構(gòu)

Android基于OpenCV實(shí)現(xiàn)QR二維碼檢測(cè)

檢測(cè)QR二維碼

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

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

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

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

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

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

/** * QR二維碼檢測(cè) * 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 // 請(qǐng)求相機(jī)權(quán)限 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, '無(wú)相機(jī)權(quán)限', Toast.LENGTH_SHORT).show() }} // 請(qǐng)求外部存儲(chǔ)權(quán)限 private val requestStoragePermission =registerForActivityResult(ActivityResultContracts.RequestPermission()) { if (it) {pickImage.launch('image/*') } else {Toast.makeText(applicationContext, '無(wú)存儲(chǔ)權(quán)限', 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, '讀取拍照結(jié)果失敗', 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, '無(wú)法解碼', Toast.LENGTH_SHORT).show() } else {Snackbar.make(mBinding.root, '解碼結(jié)果:$result', 3000).show() } Log.d(App.TAG, result)} else { Toast.makeText(applicationContext, '未檢測(cè)到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() }}結(jié)果

Android基于OpenCV實(shí)現(xiàn)QR二維碼檢測(cè)

源碼

github.com/onlyloveyd/…

以上就是Android基于OpenCV實(shí)現(xiàn)QR二維碼檢測(cè)的詳細(xì)內(nèi)容,更多關(guān)于Android OpenCV實(shí)現(xiàn)QR二維碼檢測(cè)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
伊人久久高清| 日本在线啊啊| 2023国产精品久久久精品双| 亚洲网站视频| 99国产精品自拍| 久久最新视频| 日韩av中文字幕一区二区三区| 国产日韩在线观看视频| 精品三级久久久| 日韩中文在线电影| 亚洲制服少妇| 欧美专区一区| 日韩欧美综合| 蜜桃视频一区二区| 日本在线观看不卡视频| 国产毛片一区二区三区 | 久久99视频| 欧美日韩视频免费观看| 中文字幕中文字幕精品| 国产精品任我爽爆在线播放| 日韩av在线播放网址| 国产99精品一区| 最新国产精品久久久| 国产在线日韩精品| 免播放器亚洲| 久久精品网址| 亚洲精品成人| 国产精品久久久久久av公交车| 久久久久.com| 婷婷综合成人| 婷婷激情一区| 亚洲欧洲免费| 日韩专区精品| 国产一精品一av一免费爽爽| 伊人久久在线| 日本天堂一区| 久久九九电影| 国产美女视频一区二区| 在线国产一区二区| 国产成人免费| 日本一区二区三区中文字幕| 日产精品一区二区| 美女国产精品| 日韩毛片视频| 国产欧美日韩免费观看| 99国内精品| 中文在线а√在线8| 欧美片网站免费| 久久夜色精品| 国产一区二区中文| 国产91在线精品| 日韩av一二三| 亚洲主播在线| 亚洲成人国产| 精品国产欧美| 97久久精品| 9色精品在线| 伊人久久国产| 欧美激情在线精品一区二区三区| 蜜臀久久久久久久| 国产一区视频在线观看免费| 精品免费av| 日韩高清在线观看一区二区| 亚洲欧美一区在线| 日韩国产专区| 久久久久伊人| 欧美一级一区| 综合激情在线| 亚洲欧美视频一区二区三区| 亚洲91久久| 成人日韩精品| 精品国产一区二区三区噜噜噜| 日韩激情中文字幕| 日韩精品一二三四| 亚洲二区三区不卡| 99久久视频| 日韩三区免费| 国产乱码午夜在线视频| 欧美国产免费| 国产精品男女| 国产美女亚洲精品7777| 日本午夜精品久久久| 亚洲精品成a人ⅴ香蕉片| 蜜桃av一区| 日韩精品一卡二卡三卡四卡无卡 | 日韩欧美一区二区三区在线视频 | 日韩久久精品| 欧美日韩免费观看视频| 黄色在线观看www| 久久精品国产亚洲aⅴ| 国产精品美女在线观看直播| 国产精品jk白丝蜜臀av小说| 国产亚洲久久| 国产精品66| 精品国产一区二区三区av片| 国产一区二区三区精品在线观看| 麻豆国产精品视频| 四虎成人av| 久久三级视频| 欧美日韩在线播放视频| 91成人超碰| 亚洲一区二区三区四区五区午夜| 亚洲一区日韩| 日韩综合一区二区三区| 午夜电影一区| 国产毛片久久久| 国产在线一区不卡| 亚洲成av在线| 国产精品美女久久久浪潮软件| 一本综合精品| 美女性感视频久久| 日韩一区二区三区在线免费观看| 欧美成人亚洲| 天海翼精品一区二区三区| 日韩精品免费视频人成| 国产欧美日韩精品一区二区免费 | 日韩1区在线| 99精品视频在线观看免费播放| 激情91久久| 日本在线一区二区三区| 国产伦理一区| 91麻豆国产自产在线观看亚洲| 久久精品91| 免费人成黄页网站在线一区二区 | 日韩在线麻豆| 久久亚洲道色| 欧美成人a交片免费看| 好看不卡的中文字幕| 日韩高清不卡一区| 日韩免费视频| 亚洲人成网站在线在线观看| 国产精品久久免费视频| 韩国三级一区| 亚洲一区二区三区四区电影| 国产欧美日韩一区二区三区在线| 精品久久精品| 亚洲一区日韩| 久久69成人| 久久国产精品毛片| 久久久久亚洲精品中文字幕| 欧美中文字幕一区二区| 深夜福利亚洲| 日韩精品首页| 国产乱人伦丫前精品视频 | 成人午夜亚洲| 午夜在线精品偷拍| 成人午夜在线| 午夜性色一区二区三区免费视频| 精品视频在线观看网站| 午夜在线精品| 日韩精品电影| 国产日韩欧美一区在线| 不卡av一区二区| 你懂的国产精品永久在线| 激情久久五月| 精品日韩一区| 日本不卡视频一二三区| 亚洲精品国产嫩草在线观看| 日本欧美在线| 99国产精品视频免费观看一公开| 精品国产a一区二区三区v免费| 日韩在线卡一卡二| 日韩视频网站在线观看| 国产精品片aa在线观看| 狠狠久久婷婷| 欧美久久天堂| 国产精品一区二区av日韩在线| 国产亚洲在线观看| 亚洲国产福利| 国产精品国码视频| 亚洲无线观看| 在线视频观看日韩| 韩国女主播一区二区三区| 天堂va欧美ⅴa亚洲va一国产| 欧美高清不卡| 免费看av不卡| 精品国产aⅴ| 国产精品天堂蜜av在线播放| 日韩影院免费视频| 婷婷六月综合| 91精品久久久久久久久久不卡| 久久精品国产亚洲一区二区三区| 日本亚洲视频| 美日韩精品视频| 美女少妇全过程你懂的久久| 国产精品成人a在线观看| 国产剧情在线观看一区| 四虎国产精品免费久久| 视频一区二区三区入口| 免费污视频在线一区| 在线中文字幕播放| 国产网站在线| 高清一区二区三区| 免费观看亚洲天堂| 欧美一级二级视频| 日韩欧美四区| 91精品国产经典在线观看| 日韩一区二区三区在线看| 久久亚洲风情| 日韩在线一区二区|