第一部分(數字區域提取)
首先,准備一張待提取數字的圖片(存放路徑與當前工程的主程序一致)
提取原理:顏色空間由RGB轉換到HSV空間下,通過對H、S、V分別設置上下限顯示出當前圖片,直到選取到最佳的數字區域。
上圖為數字區域提取效果,記錄下當前的H、S、V的上下限。
下面為這一部分的程序源碼
#include<opencv2/core.hpp> #include<opencv2/highgui.hpp> #include<opencv2/imgproc.hpp> using namespace cv; #include<iostream> #include<string> using namespace std; //輸入圖像 Mat img; //灰度值歸一化 Mat bgr; //HSV圖像 Mat hsv; //色相 int hmin = 0; int hmin_Max = 360; int hmax = 180; int hmax_Max = 360; //飽和度 int smin = 0; int smin_Max = 255; int smax = 255; int smax_Max = 255; //亮度 int vmin = 106; int vmin_Max = 255; int vmax = 255; int vmax_Max = 255; //顯示原圖的窗口 string windowName = "src"; //輸出圖像的顯示窗口 string dstName = "dst"; //輸出圖像 Mat dst; //回調函數 void callBack(int, void*) { //輸出圖像分配內存 dst = Mat::zeros(img.size(), img.type()); //掩碼 Mat mask; inRange(hsv, Scalar(hmin, smin, vmin), Scalar(hmax, smax, vmax), mask); //掩模到原圖的轉換 imshow("mask", mask); for (int r = 0; r < bgr.rows; r++) { for (int c = 0; c < bgr.cols; c++) { if (mask.at<uchar>(r, c) == 255) { dst.at<Vec3b>(r, c) = bgr.at<Vec3b>(r, c); } } } //輸出圖像 imshow(dstName, dst); //保存圖像 //dst.convertTo(dst, CV_8UC3, 255.0, 0); imwrite("HSV_inRange.jpg", dst); } int main(int argc, char** argv) { //輸入圖像 img = imread("40.jpg"); if (!img.data || img.channels() != 3) return -1; imshow(windowName, img); bgr = img.clone(); //顏色空間轉換 cvtColor(bgr, hsv, CV_BGR2HSV); //cout << hsv << endl; //定義輸出圖像的顯示窗口 namedWindow(dstName, WINDOW_GUI_EXPANDED); //調節色相 H createTrackbar("hmin", dstName, &hmin, hmin_Max, callBack); createTrackbar("hmax", dstName, &hmax, hmax_Max, callBack); //調節飽和度 S createTrackbar("smin", dstName, &smin, smin_Max, callBack); createTrackbar("smax", dstName, &smax, smax_Max, callBack); //調節亮度 V createTrackbar("vmin", dstName, &vmin, vmin_Max, callBack); createTrackbar("vmax", dstName, &vmax, vmax_Max, callBack); callBack(0, 0); waitKey(0); return 0; }
下一篇為數字的分割
·