1. 程式人生 > >計算機視覺筆記(一) 初探計算機視覺

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

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(2, 3, CV_8UC1);
    cout << "Z=" << Z << endl;
    Mat O = Mat::ones(2, 3, CV_32F);
    cout << "O=" << O << endl;
    Mat E = Mat::eye(2
, 3, 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", 1);
    Rect rect(180, 200, 200, 200);//(x,y)=(180,200),w=200,height=200
    Mat roi = Mat(pImg, rect);
    Mat pImgRect = pImg.clone();//深拷貝
    rectangle(pImgRect, rect, Scalar(0, 255, 0), 2);
    imshow("original image with rectangle", pImgRect);
    imshow("roi", roi);
    waitKey();
    return 0;
}

執行結果

2)、淺拷貝、深拷貝
深拷貝兩種方式:
(1)Mat pImgRect = pImg.clone();
(2)Mat pImgRect = pImg.copyto();

這裡寫圖片描述

4、畫素值的讀寫

1).at(i, j)方式

    //灰度影象
    Mat grayim(512, 512, CV_8UC1);
    uchar value = grayim.at<uchar>(0, 0);
    for (int i = 0; i < grayim.rows; i++)
        for (int j = 0; j < grayim.cols; j++)
            grayim.at<uchar>(i, j) = (i + j) % 255;
    imshow("gray", grayim);

    //彩色影象
    Mat colorim(512, 512, CV_8UC3);
    for (int i = 0; i < colorim.rows; i++)
        for (int j = 0; j < colorim.cols; j++)
        {
            Vec3b pixel;
            pixel[0] = i % 255;//B
            pixel[1] = j % 255;//G
            pixel[2] = 0;      //R
            colorim.at<Vec3b>(i, j) = pixel;
        }
    imshow("color", colorim);

2)迭代器

//灰度影象
    Mat grayim(512, 512, CV_8UC1);
    Mat_<uchar>::iterator grayit;
    for (grayit = grayim.begin<uchar>(); grayit < grayim.end<uchar>(); grayit++)
        *grayit = rand() % 255;
    imshow("gray", grayim);

    //彩色影象
    Mat colorim(512, 512, CV_8UC3);
    Mat_<Vec3b>::iterator colorit;
    for (colorit = colorim.begin<Vec3b>(); colorit < colorim.end<Vec3b>(); colorit++)
    {
        (*colorit)[0] = rand() % 255;
        (*colorit)[1] = rand() % 255;
        (*colorit)[2] = rand() % 255;
    }
    imshow("color", colorim);

3)、指標按行遍歷

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

4)、Mat_類

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

5)、一般有對映關係時使用

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

量化公式,降低灰度級

Mat M(512, 512, CV_8UC1);
    Mat_<uchar> M1 = (Mat_<uchar>&)M;
    for (int i = 0; i < M1.rows; i++)
    {
        uchar *p = M1.ptr(i);
        for (int j = 0; j < M1.cols; j++)
        {
            double d1 = (double)((i + j) % 255);
            M1(i, j) = d1;
            double d2 = M1(i, j);
        }
    }
    Mat Out;
    int divideWith = 10;
    uchar table[256];
    for (int i = 0; i < 256; i++)
        table[i] = divideWith*(i / divideWith);

    Mat lookUpTable(1, 256, CV_8U);
    uchar *p = lookUpTable.data;
    for (int i = 0; i < 256; 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 -1;
    }
    Mat edges;
    namedWindow("edges", 1);
    for (;;)
    {
        Mat frame;
        cap >> frame;
        if (frame.empty())
            break;

        imshow("frame", frame);

        if (waitKey(30) >= 0)
            break;
    }

    waitKey();

2)寫視訊

    Size s(320, 240);
    VideoWriter writer = VideoWriter("myvideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25, s);
    if (!writer.isOpened())
    {
        cerr << "Can not creat a video." << endl;
        return -1;
    }
    Mat frame(s, CV_8UC3);
    for (int i = 0; i < 100; 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演算法:參考待測點周圍最近的k個數據的label是什麼,將出現頻率最高的label作為該點的預測結果。

Knn作為一種機器學習的演算法也分為兩部分
訓練:把訓練集和標籤全部儲存,比如說給下圖這樣一個訓練影象,把下圖和它的label(5)儲存,把這些儲存完,它就學習完畢了。

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

劣勢:沒有訓練,測試的時候需要把所有訓練集都拿來和測試的資料一一比對,比對就涉及距離問題,測試兩個向量的距離。
優勢:簡單。當資料不是線性的時候,表現比其他分類器好一些。

引數K的選擇一般不大於20。

示例:
//補充

(八)K-means(聚類)

聚類演算法

K-means

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

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

K1,K2,K3指定之後,找到離它最近的一個數據作為center,進行label,把資料分成三個label,在相同label的資料中求均值,定義均值作為新的中心,進行迴圈迭代,直到收斂為止,停止條件是中心變化很小或者是所有資料的label已經不變了。


Example:顏色降維

相關推薦

計算機視覺筆記 初探計算機視覺

Outline: 1.CV背景介紹 2.OpenCV基礎 3.影象的基本操作:遍歷影象,ROI選取 4.Python環境搭建 5.機器學習在CV中的應用:KNN與Kmeans 一、什麼是Computer Vision(CV) 計算機視覺的目的:

計算機網路筆記【謝希仁編著】

1、計算機網路在資訊時代的作用  “三網”,電信網路,有線電視網路、和計算機網路。  向用戶提供的兩個功能:(1)連通性;(2)共享; 2、因特網概述  - 網路由若干結點和連線這些結點的鏈路組成,結點可以是計算機,集線器,交換機或路由器等; - 網路的網路:網際網路,通過路

朱老師ARM裸機學習筆記計算機基礎知識

RISC和CISC的區別 CISC(complex instruction-set computer)複雜指令集 特點: 指令較多,較豐富,CISC的CPU 較難設計,Intel是典型的CISC體系CPU。 RISC(reduce instruction

Python資料分析入門——初探資料視覺

前言 靜下心算算,當程式設計師已經有好幾年了,不過自大學時代開始,學習對我來說就是個被動接受的過程,學校的課程、當時熱門的移動端開發、資料庫的學習、web學習、PHP後端學習……需要做什麼我便去學什麼,到了今天,突然意識到我是不是該給自己一個明確的發展方向了,畢竟歲月不饒人

Caffe視覺:網路結構視覺用Caffe自帶程式實現

Caffe視覺化(一):網路結構視覺化(用Caffe自帶程式實現) 本文記錄瞭如何利用Caffe自帶的程式實現網路的視覺化,包括可能遇到的問題和解決方案。更新於2018.10.25。 文章目錄 Caffe視覺化(一):網路結構視覺化(用Caffe自帶程式實現

計算機視覺系列:學習筆記

一. 影象基礎:畫素 畫素是影象最基礎的構成要素,每一張影象都是由畫素集合組成。 如果我們將影象當作一個網格,則每一小塊是由單個畫素組成,如下圖: 上圖的解析度為1000 * 750,意味著有1000畫素寬,750畫素高。可以將一張影象

2017CS231n李飛飛深度視覺識別筆記——計算機視覺概述和歷史背景

第一章 計算機視覺概述和歷史背景課時1 計算機視覺概述    計算機視覺:針對視覺資料的研究。    關鍵是如何用演算法來開發可以利用和理解的資料,視覺資料存在的問題是它們很難理解,有時把視覺資料稱為“

計算機視覺入門

pen HA 圖像處理 area opencv col numpy 幾何變換 卷積神經網絡 一、掌握知識   (一)計算機視覺之OpenCV 圖片讀取與展示、圖片寫入、圖片質量控制、像素操作 幾何變換、圖片特效、圖像美化、機器學習 機器學習:視頻分解

《編碼-隱匿在計算機背後的語言》 —— 讀書筆記:編碼

分享圖片 信號 組合 大小寫 不變 缺點 改變 有著 書寫 1. 至親密友 1) 什麽是編碼?編碼是一種用來在機器與人之間傳遞信息的方式,編碼就是交流。 2)莫爾斯電碼,只有點和劃(國際求救信號:SOS ...---...),缺點是不區分大小寫。

《深入理解計算機系統》——讀書筆記

img 可執行 即將 簡單的 world std 加載 完整 .exe   這本書從一個簡單的C語言的HelloWorld程序講起...   這是這個小程序的生命周期的一個部分:   HellOWorld程序,從被創建(文本格式),到被執行(在屏幕上打印出來)。   其

計算機視覺利用Harris檢測子進行角點特徵檢測含matlab原始碼

    本文為原創文章,轉載請註明本文來自http://blog.csdn.net/anymake_ren/article/details/21298807     計算機視覺中常用的影象特徵包括:點、

程式設計師面試寶典隨筆記----計算機網路知識點梳理

傳輸層概 作用:傳輸層為它上面的應用層提供通訊服務。 在OSI七層參考模型中,傳輸層是面向通訊的最高層,也是使用者功能的最底層。 傳輸層兩大重要的功能:複用 和 分用。 複用:在傳送端,多個應

《深入理解計算機系統》學習筆記

一、資訊就是位 + 上下文 作者使用的標題是:資訊就是位 + 上下文,那麼問題來了:什麼是位?什麼是上下文? 計算機系統是由硬體和系統軟體組成的,它們共同工作來執行應用程式。所有計算機系統都有相似的硬體和軟體元件,它們執行著相似的功能。 從某種意義上來說,本書的目的就是要幫助你

計算機模擬技術學習筆記

一、數學建模方法 1.建模的基本要求 (1)清晰性:模組化 (2)切題性:與研究目的相關 (3)資料準確、精確 2.建模的原則 (1)構築模組的思想 將系統的描述組織成一系列模組,每個模組代表系統的一個部分,每個部分可以由一個或多個輸入變數組成,同時產生多個輸出變數,系統作為一個整體就可以由不同

計算機網路讀書筆記概述

一、計算機網路在資訊時代中的作用 (1)計算機網路使使用者能夠在計算機之間傳送資料檔案 (2)當今世界上最大的計算機網路Internet——網際網路 (3)可以從兩個方面來認識網際網路:網際網路的應用和網際網路的工作原理 (4)網際網路兩個基本特點:連通性和共享(共享指資源共享,可以

CSSAPP稀裡糊塗的讀書筆記計算機系統漫遊

主要介紹了計算機系統的一些概念知識等。 系統中的所有資訊,都是由一串位表示的。區分不同資料物件的唯一方法是我們讀到這些資料物件時的上下文。 將一個程式翻譯成一個可執行目標檔案經過四個階段:預處理

計算機網路第七版》讀書筆記概述

重點: 網際網路邊緣部分和核心部分的作用,其中包含分組交換的概念 計算機網路的效能指標 計算機網路分層次的體系結構,包含協議和服務的概念 0、網際網路概述 0、網際網路的兩個基本特點:連通性(資料通訊)和共享(資源共

計算機圖形學 學習筆記:概述,直線掃描轉換演算法:DDA,中點畫線演算法,Bresenham演算法

前言 感謝中國農大 趙明老師的分享~ 現在我要為我自己走向遊戲程式設計打下基石~ 1 計算機圖形學概論 1.1 計算機圖形學課程簡介 《計算機圖形學》是計算機、地理資訊系統、應用數學、機械、建築等專業本科教學中的一門重要的專業基礎課 如影

深入理解計算機系統學習筆記

程式的編譯過程 為了說明程式的編譯過程,我們用經典的hello world程式作為例子 #include <stdio.h> int main(int argc, char const *argv[]) { printf("hell

[計算機基礎]計算機系統學習筆記

1,ASCII嗎  ASCII碼的含義就是用一個唯一的位元組大小的整數值來表示每個字元。 ASCII碼對照表  例如:文字檔案  sss  qhd  以上文字檔案對應的二進位制檔案是: 00000000h: 73 73 73 0D 0A 71 64 63