本篇文章為大家展示了OpenCV4Android中怎么獲取卡號輪廓顯示,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
我們提供的服務有:網(wǎng)站制作、成都做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、高邑ssl等。為近1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術(shù)的高邑網(wǎng)站制作公司
我們在OpenCVCaremaActivity中的ImgView里面加入拍照事件
首先加一個boolean的變量,這樣在按鈕的時候?qū)崟r動態(tài)顯示先不進行處理了
按鈕事件流程
將獲取的Mat圖像進行處理,處理方法我們都寫在了OpenCvUtil里面了,一會兒說GetAreaMat的方法
然后將處理好的Mat轉(zhuǎn)成bitmap的圖像.
再把bitmap的圖像轉(zhuǎn)為byte的數(shù)組,傳遞到我們的主頁界面
關(guān)閉本頁面.
最后主頁面的onActivityResulty的方法把byte的數(shù)組轉(zhuǎn)回成bmp顯示在頁面上
Mat圖像處理方法
我們攝像頭獲取卡號時,拍下的照片進行處理,把多余部分盡量去掉,獲取一個完整的卡片信息,以便于我們后序的圖像識別.
獲取卡片圖像的操作原理
原圖像的梯度求取
然后把梯度圖像進行二值化處理
然后在輪廓的發(fā)現(xiàn)與過濾
返回圖像
OpenCvUtils里的GetAreaMat方法,就是按照我們上面的原理流程寫出的處理方法,直接貼出來,里面的Matgradient方法是圖像梯度化的方法,仔細看了下就是整個流程:
public class OpenCvUtils {
//獲取需要的區(qū)域
public static Mat GetAreaMat(Mat src) {
Mat dst = new Mat();
Mat area = new Mat();
src.copyTo(dst);
//首先將資源梯度化
Matgradient(dst);
//先改為灰度圖像
Imgproc.cvtColor(dst, dst, Imgproc.COLOR_BGR2GRAY);
//二值化圖像處理
Imgproc.threshold(dst, dst, 40, 255, Imgproc.THRESH_BINARY);
//對圖像進行開操作(先腐蝕后膨脹)
Mat strElement = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));
Imgproc.morphologyEx(dst, dst, Imgproc.MORPH_OPEN, strElement);
//尋找輪廓
List<MatOfPoint> contours = new ArrayList<>();
Mat hireachy = new Mat();
/**
* Imgproc.RETR_EXTERNAL代表尋找輪廓外層最大的輪廓
*/
Imgproc.findContours(dst, contours, hireachy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0, 0));
/**
* 獲取寬和高
* 用于除2是為了占總圖像一半,用于分析想找到的區(qū)域
*/
int hw = dst.cols()/2;
Rect roi = new Rect();
for(int i=0;i<contours.size();i++) {
Rect rect = Imgproc.boundingRect(contours.get(i));
if (rect.width > hw ) {
roi.x = rect.x;
roi.y = rect.y;
roi.width = rect.width;
roi.height = rect.height;
break;
}
}
//為0說明未找到區(qū)域
if (roi.width == 0 || roi.height == 0) {
src.copyTo(area);
} else {
src.submat(roi).copyTo(area);
}
dst.release();
return area;
}
//將Mat對象梯度化
private static void Matgradient(Mat src) {
//先計算梯度
Mat grad_x = new Mat();
Mat grad_y = new Mat();
Mat abs_grad_x = new Mat();
Mat abs_grad_y = new Mat();
//先把X方向梯度化
Imgproc.Scharr(src, grad_x, CvType.CV_32F, 1, 0);
//再把Y方向梯度化
Imgproc.Scharr(src, grad_y, CvType.CV_32F, 0, 1);
//絕對值
/**
* 因為獲取的grad_x和grad_y有可能是負值,我們要求的是0-255之間的數(shù)值
* 所以需要把原來的梯度化的生成絕對值
*/
Core.convertScaleAbs(grad_x, abs_grad_x);
Core.convertScaleAbs(grad_y, abs_grad_y);
grad_x.release(); //處理完記得及時釋放節(jié)省資源
grad_y.release(); //處理完記得及時釋放節(jié)省資源
//梯度圖像
/**
* 根據(jù)最后獲取的兩個絕對值,把圖像重新合并,兩個0.5的參數(shù)就是圖像的比重
*/
Core.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, src);
abs_grad_x.release(); //處理完記得及時釋放節(jié)省資源
abs_grad_y.release(); //處理完記得及時釋放節(jié)省資源
}
}
上述內(nèi)容就是OpenCV4Android中怎么獲取卡號輪廓顯示,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
本文題目:OpenCV4Android中怎么獲取卡號輪廓顯示
鏈接分享:http://aaarwkj.com/article18/jejcdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、品牌網(wǎng)站設(shè)計、響應式網(wǎng)站、網(wǎng)站營銷、用戶體驗、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)