您好,登錄后才能下訂單哦!
本篇文章為大家展示了OpenCV4Android中怎么獲取卡號輪廓顯示,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
我們在OpenCVCaremaActivity中的ImgView里面加入拍照事件
首先加一個boolean的變量,這樣在按鈕的時候實時動態顯示先不進行處理了
按鈕事件流程
將獲取的Mat圖像進行處理,處理方法我們都寫在了OpenCvUtil里面了,一會兒說GetAreaMat的方法
然后將處理好的Mat轉成bitmap的圖像.
再把bitmap的圖像轉為byte的數組,傳遞到我們的主頁界面
關閉本頁面.
最后主頁面的onActivityResulty的方法把byte的數組轉回成bmp顯示在頁面上
Mat圖像處理方法
我們攝像頭獲取卡號時,拍下的照片進行處理,把多余部分盡量去掉,獲取一個完整的卡片信息,以便于我們后序的圖像識別.
獲取卡片圖像的操作原理
原圖像的梯度求取
然后把梯度圖像進行二值化處理
然后在輪廓的發現與過濾
返回圖像
OpenCvUtils里的GetAreaMat方法,就是按照我們上面的原理流程寫出的處理方法,直接貼出來,里面的Matgradient方法是圖像梯度化的方法,仔細看了下就是整個流程:
public class OpenCvUtils {
//獲取需要的區域
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是為了占總圖像一半,用于分析想找到的區域
*/
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說明未找到區域
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之間的數值
* 所以需要把原來的梯度化的生成絕對值
*/
Core.convertScaleAbs(grad_x, abs_grad_x);
Core.convertScaleAbs(grad_y, abs_grad_y);
grad_x.release(); //處理完記得及時釋放節省資源
grad_y.release(); //處理完記得及時釋放節省資源
//梯度圖像
/**
* 根據最后獲取的兩個絕對值,把圖像重新合并,兩個0.5的參數就是圖像的比重
*/
Core.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, src);
abs_grad_x.release(); //處理完記得及時釋放節省資源
abs_grad_y.release(); //處理完記得及時釋放節省資源
}
}
上述內容就是OpenCV4Android中怎么獲取卡號輪廓顯示,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。