計算機視覺筆記(一) 初探計算機視覺
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