天天看點

計算機視覺筆記(一) 初探計算機視覺

Outline:

1.CV背景介紹

2.OpenCV基礎

3.圖像的基本操作:周遊圖像,ROI選取

4.Python環境搭建

5.機器學習在CV中的應用:KNN與Kmeans

一、什麼是Computer Vision(CV)

計算機視覺的目的:通過寫程式來解釋圖檔。

圖像處理:輸入圖像,輸出圖像

計算機視覺:輸入圖像,輸出圖像的了解。

二、圖像處理庫

圖像處理庫:

OpenCV

CxImage ~= OpenCV1.0

CImg 顯示做的好

FreeImage 大量使用指針讀速度快,讀到圖像的資訊全

HALCON 商用精密測量

項目:

OpenBR 人臉識别項目

EasyPR 識别車牌

(三)OpenCV安裝配置

安裝配置參考淺墨部落格:部落格連結

因為之前學過OpenCV,是以就安裝配置了好多次了,但我一般都是用學校的電腦,筆記本上沒配。本來配置很順手了,這次遇到一個問題:無法打開檔案“opencv_ml249d.lib”。找了半天沒找出配置步驟上出什麼問題,看淺墨部落格找到了解決方法:項目->屬性管理器->Debug|Win32->Microsoft.Cpp.Win32.userDirectories中的屬性頁面->連接配接器->正常裡面的附加庫目錄中加入相應的lib檔案目錄。

還有就是,屬性管理器在圖->其他管理器裡裡,老找不着。。。

可安裝插件ImageWatch:下載下傳連結,能顯示Mat内容,友善調試

(四)圖像處理基礎知識

一、彩色圖像存儲:BGR

二、Mat

1、常用構造函數

計算機視覺筆記(一) 初探計算機視覺

2、全零矩陣、全一矩陣、對角線為1矩陣

Mat Z = Mat::zeros(, , CV_8UC1);
    cout << "Z=" << Z << endl;
    Mat O = Mat::ones(, , CV_32F);
    cout << "O=" << O << endl;
    Mat E = Mat::eye(, , CV_64F);
    cout << "E=" << E << endl;
           

3、ROI:

1)、感興趣區域的設定

#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
    Mat pImg = imread("Lena.jpg", );
    Rect rect(, , , );//(x,y)=(180,200),w=200,height=200
    Mat roi = Mat(pImg, rect);
    Mat pImgRect = pImg.clone();//深拷貝
    rectangle(pImgRect, rect, Scalar(, , ), );
    imshow("original image with rectangle", pImgRect);
    imshow("roi", roi);
    waitKey();
    return ;
}
           

運作結果

計算機視覺筆記(一) 初探計算機視覺

2)、淺拷貝、深拷貝

深拷貝兩種方式:

(1)Mat pImgRect = pImg.clone();

(2)Mat pImgRect = pImg.copyto();

計算機視覺筆記(一) 初探計算機視覺

4、像素值的讀寫

1).at(i, j)方式

//灰階圖像
    Mat grayim(, , CV_8UC1);
    uchar value = grayim.at<uchar>(, );
    for (int i = ; i < grayim.rows; i++)
        for (int j = ; j < grayim.cols; j++)
            grayim.at<uchar>(i, j) = (i + j) % ;
    imshow("gray", grayim);

    //彩色圖像
    Mat colorim(, , CV_8UC3);
    for (int i = ; i < colorim.rows; i++)
        for (int j = ; j < colorim.cols; j++)
        {
            Vec3b pixel;
            pixel[] = i % ;//B
            pixel[] = j % ;//G
            pixel[] = ;      //R
            colorim.at<Vec3b>(i, j) = pixel;
        }
    imshow("color", colorim);
           

2)疊代器

//灰階圖像
    Mat grayim(, , CV_8UC1);
    Mat<uchar>::iterator grayit;
    for (grayit = grayim.begin<uchar>(); grayit < grayim.end<uchar>(); grayit++)
        *grayit = rand() % ;
    imshow("gray", grayim);

    //彩色圖像
    Mat colorim(, , CV_8UC3);
    Mat<Vec3b>::iterator colorit;
    for (colorit = colorim.begin<Vec3b>(); colorit < colorim.end<Vec3b>(); colorit++)
    {
        (*colorit)[] = rand() % ;
        (*colorit)[] = rand() % ;
        (*colorit)[] = rand() % ;
    }
    imshow("color", colorim);
           

3)、指針按行周遊

Mat grayim(, , CV_8UC1,Scalar());
    for (int i = ; i < grayim.rows; i++)
    {
        uchar *p = grayim.ptr<uchar>(i);
        for (int j = ; j < grayim.cols; j++)
            p[j] = rand() % ;
    }
    imshow("gray", grayim);
           

4)、Mat_類

Mat M(, , CV_8UC1);
    Mat_<uchar> M1 = (Mat_<uchar>&)M;
    for (int i = ; i < M1.rows; i++)
    {
        uchar *p = M1.ptr(i);
        for (int j = ; j < M1.cols; j++)
        {
            double d1 = (double)((i + j) % );
            M1(i, j) = d1;
            double d2 = M1(i, j);
        }
    }
           

5)、一般有映射關系時使用

查找表(降低灰階級,提高運算速度)

量化公式,降低灰階級

計算機視覺筆記(一) 初探計算機視覺
Mat M(, , CV_8UC1);
    Mat_<uchar> M1 = (Mat_<uchar>&)M;
    for (int i = ; i < M1.rows; i++)
    {
        uchar *p = M1.ptr(i);
        for (int j = ; j < M1.cols; j++)
        {
            double d1 = (double)((i + j) % );
            M1(i, j) = d1;
            double d2 = M1(i, j);
        }
    }
    Mat Out;
    int divideWith = ;
    uchar table[];
    for (int i = ; i < ; i++)
        table[i] = divideWith*(i / divideWith);

    Mat lookUpTable(, , CV_8U);
    uchar *p = lookUpTable.data;
    for (int i = ; i < ; i++)
        p[i] = table[i];
    LUT(M, lookUpTable, Out);
    imshow("origin", M);
    imshow("result", Out);
           
計算機視覺筆記(一) 初探計算機視覺

5、資料擷取與存儲

1)imread

Mat pImg = imread("Lena.jpg", 1);
//flag=0,強制轉換為單通道,flag=1不改變
           

2)imwrite

8U的可以轉化為圖像 看手冊

直接覆寫

6、video讀寫類

1)讀視訊

//讀視訊
    //VideoCapture cap(0);  //攝像頭id
    VideoCapture cap("video.avi");  //本地視訊
    if (!cap.isOpened())
    {
        cerr << "Can not open a camera or file." << endl;
        return;
    }
    Mat edges;
    namedWindow("edges",);
    for (;;)
    {
        Mat frame;
        cap >> frame;
        if (frame.empty())
            break;

        imshow("frame", frame);

        if (waitKey) >=)
            break;
    }

    waitKey();
           

2)寫視訊

Size s(, );
    VideoWriter writer = VideoWriter("myvideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), , s);
    if (!writer.isOpened())
    {
        cerr << "Can not creat a video." << endl;
        return -;
    }
    Mat frame(s, CV_8UC3);
    for (int i = ; i < ; i++)
    {
        writer << frame;
    }
           

(五)python

涉及到深度學習與機器學習相關的内容,是以要學習一下python

python環境的安裝,建議Anaconda+Ipython(Jupyter )+(PyScripter)(版本2.7比較流行或者3.5都可以)

python教程:基礎教程網站

Anaconda下載下傳:

官網下載下傳

官網下載下傳容易出現下載下傳失敗!真的不要嘗試在官網下載下傳。下了好幾次,動不動就是連結斷開下載下傳失敗的。。

(劃重點)從國内清華大學開源軟體鏡像站進行下載下傳并配置鏡像。連結

推薦一個下載下傳安裝教程

緻Python初學者們 - Anaconda入門使用指南 連結位址

Jupyter notebook 使用教程

(六)機器學習

1、機器學習:要随機地觀測資料,要随機地對觀測資料進行采樣,要學習資料的性質(也叫做特征feature)以及屬性(通常叫做label,它是屬于哪個類别的),然後再來預測新的未知資料的屬性。在機器學習,通常把資料分為兩部分,一部分是訓練集training,一部分是測試集test,兩部分互相獨立。

2、監督式學習(除了資料以外,還有額外的屬性,如feature&label):分類和回歸

分類:輸出是離散的。例:根據各種特征,将一個群體,分成幾種。

回歸:輸出連續的。例:根據年齡體重,預測身高。

監督學習主要是分類,盡量把問題轉化為分類問題。

3、非監督式學習(沒有額外的label):聚類和核密度估計

聚類:K-means算法。

(七)KNN(分類)

Knn的應用背景是:手寫字元識别

最常用的資料庫 http://yann.lecun.com/exdb/mnist/

當求未知項目的類别時,先探測周圍項目是什麼類别。轉換成算法:

第一種實作思路:

用一條線把這兩個區域分開,叫決策邊界,把所有資料一分為二。但是要求資料必須是線性可分的,如果資料複雜的時候,就要做非線性的變換了,把資料映射到多元空間中,讓它成為線性可分的。

計算機視覺筆記(一) 初探計算機視覺

第二種思路:

就是Knn算法:參考待測點周圍最近的k個資料的label是什麼,将出現頻率最高的label作為該點的預測結果。

Knn作為一種機器學習的算法也分為兩部分

訓練:把訓練集和标簽全部存儲,比如說給下圖這樣一個訓練圖像,把下圖和它的label(5)存儲,把這些存儲完,它就學習完畢了。

計算機視覺筆記(一) 初探計算機視覺

測試:提供測試集,沒有标簽,讓算法猜這是什麼,要指定K的大小。

劣勢:沒有訓練,測試的時候需要把所有訓練集都拿來和測試的資料一一比對,比對就涉及距離問題,測試兩個向量的距離。

優勢:簡單。當資料不是線性的時候,表現比其他分類器好一些。

參數K的選擇一般不大于20。

示例:

//補充

(八)K-means(聚類)

聚類算法

計算機視覺筆記(一) 初探計算機視覺

K-means

主要做法:選取一個點,對于一堆資料,把它聚成n類。

示例:我們有一堆資料,指定三個資料,把它們聚成三類。

K1,K2,K3指定之後,找到離它最近的一個資料作為center,進行label,把資料分成三個label,在相同label的資料中求均值,定義均值作為新的中心,進行循環疊代,直到收斂為止,停止條件是中心變化很小或者是所有資料的label已經不變了。
           
計算機視覺筆記(一) 初探計算機視覺
計算機視覺筆記(一) 初探計算機視覺

Example:顔色降維

計算機視覺筆記(一) 初探計算機視覺

繼續閱讀