1. 程式人生 > >OpenCV從入門到放棄:摸魚筆記(一)

OpenCV從入門到放棄:摸魚筆記(一)

    零cpp基礎的小白探索OpenCV從從入門到放棄的摸魚記錄從這裡開始。

    參考書:《OpenCV3程式設計入門》毛星雲、冷雪飛 等編著 電子工業出版社

一、OpenCV(Open Source Computer Vision Library)開源計算機視覺庫

    一個開源的機器視覺、影象處理的SDK(Software Development Kit / 軟體開發工具包),支援C、C++、Python、Ruby等多種程式語言。

二、常用OpenCV標頭檔案

    1、<opencv2/core/core.hpp>

OpenCV核心元件,核心功能模組。包含基本資料結構(如Mat、Rect等)、基本繪圖操作、畫素操作、ROI設定、影象混合、DFT(Discrete Fourier Transform)等

    2、<opencv2/imgproc/imgproc.hpp>

OpenCV影象處理元件。包括影象濾波、直方圖、特徵檢測、影象變換等等

    3、<opencv2/highgui/highgui.hpp>

OpenCV高層GUI圖形使用者介面模組。包括影象載入、顯示、寫入、滑動條、滑鼠操作等

    4、<opencv2/opencv.hpp>

此標頭檔案定義包括以上三個在內的多個頭檔案,為了簡化程式碼使用。本小白入門被建議不使用它。

三、OpenCV核心資料結構

1、Mat類

    OpenCV中影象儲存的類,實為矩陣。由矩陣頭(包括矩陣尺寸、儲存方法、儲存地址等資訊)和一個指向儲存所有畫素的矩陣的指標兩個部分組成。因此 Mat類在複製上有一個需要注意的點,賦值運算子和拷貝建構函式只複製資訊頭,並不複製影象本身儲存資訊。如

Mat A,C;
A = imread("1.jpg",CV_LOAD_IMAGE_COLOR);
Mat B (A); //拷貝建構函式
C = A;     //賦值運算子
以上A、B、C最終都指向同一個也是唯一一個數據矩陣。雖然資訊頭不同,但通過任何一個物件所做的改變也會影響其他物件。真想要複製應使用Mat的成員函式,如下
Mat F = A.clone();
Mat G;
A.copyTo(G);
這樣使用,改變F或者G就不會影響Mat資訊頭所指向的矩陣了。

    Mat有多個非常有用的常用成員函式:

M.cols  返回矩陣列數

M.rows  返回矩陣行數

M.total()  返回矩陣元素數(不考慮多通道)

M.channels()  返回矩陣通道數

M.size()  以size類返回矩陣的尺寸

M.at  對矩陣元素進行訪問

包括上面提及的.clone()和.copyTo等等,更多實用成員函式有待深入瞭解。

2、Point類

表示座標中一個點的型別。Point2i和Point_<int>等價於Point,整形的座標點。用法:

//方法一
Point point;
point.x = 10;
point.y = 8;
//方法二
Point point = Point(10,8);

3、Scalar類

表示具有四個元素的陣列,在OpenCV中用於傳遞畫素值。

Scalar(a,b,c,d);
其中a、b、c分別表示BGR分量(就是反過來的),d表示alpha通道分量。

4、Size類

在OpenCV中用於表示尺寸的一個類,其兩個重要的資料成員:width、heght 兩個分表表示寬度和高度。

5、Rect類

表示一個矩形的類。成員變數有x、y、width、height分別表示左上角的點橫座標、縱座標、矩形的寬度、高度。

Rect類常用的成員函式有:

rect.Size()  //返回矩形的尺寸

rect.area()  //返回矩形的面積

rect.contains(Point)  //判斷點是否在矩形內

rect.inside(Rect)  //判斷矩形是否在該矩形內

rect.tl  //返回左上角座標

rect.br  //返回右下角座標

矩形交集並集操作:

Rect rect = rect1 |  rect2;  //並集
Rect rect = rect1 & rect2;  //交集
矩形平移操作:
Rect rectShift = rect + point;
矩形縮放操作:
Rect rectScale = rect + size;

6、cvtColor()函式

顏色空間轉換函式,使用格式:

cvtColor(inimg,outimg,CV_GRAY2BRG)
第一個引數為輸入影象,第二個引數為輸出影象,第三個引數為識別符號,表示轉換的目標顏色空間,查表可得。

四、第一個程式任務

任務:背景虛化功能。實時處理操作,圓圈外背景模糊,圓圈內保持清晰不變,圓圈位置和大小可以改變。

個人思路:滑鼠操作確定圓心,滿足在半徑範圍內的點畫素值不變,其他的畫素值用均值濾波後的數值替代。

#include <opencv2/core/core.hpp>	 //OpenCV核心元件(Mat Point Rect etc.)
#include <opencv2/highgui/highgui.hpp>   //讀寫展示影象 、視窗元件
#include <opencv2/imgproc/imgproc.hpp>   //影象處理元件
#include<iostream>                       //cin、cout標頭檔案
#include<ctime>                          //包含clock_t類標頭檔案
using namespace cv;                      //指定OpenCV的名稱空間
	
Mat img,temp;
int radius = 80,value = 5,k;  //初始化半徑80個畫素,平均濾波運算元size為5
clock_t t1,t2;
void on_Trackbar(int,void*)  //滑條回撥函式
{
	k = value;
}
Mat my_blur(int x,int y)  //圈外虛化處理函式
{
	Mat imgblur;	
	img.copyTo(imgblur);
	blur(img,imgblur,Size(k,k));
	//GaussianBlur(img,imgblur,Size(5,5),25,25);
	Point center(x,y);	  //定義點center 賦初值x,y
	for(int m = 1; m <= img.cols; m++)
		for (int n = 1; n <= img.rows; n++)  //m為列/x座標,n為行/y座標
		{ 
			if( ((m-x) * (m-x) + (n-y) * (n-y))<= (radius * radius))  //圈內用原畫素值替換
			{
    //          imgblur.at<Vec3b>(Point(m, n))[0] = temp.at<Vec3b>(Point(m, n))[0]  ;  // B分量
    //          imgblur.at<Vec3b>(Point(m, n))[1] = temp.at<Vec3b>(Point(m, n))[1]  ;  // G分量(用法1) point(x座標/列,y座標/行)
    //          imgblur.at<Vec3b>(Point(m, n))[2] = temp.at<Vec3b>(Point(m, n))[2]  ;  // R分量
		imgblur.at<Vec3b>(n,m)[0] = temp.at<Vec3b>(n,m)[0]  ;  // B分量
                imgblur.at<Vec3b>(n,m)[1] = temp.at<Vec3b>(n,m)[1]  ;  // G分量(用法2)
                imgblur.at<Vec3b>(n,m)[2] = temp.at<Vec3b>(n,m)[2]  ;  // R分量
			}
		}
    circle(imgblur,center,radius,Scalar(255,255,255));//circle(圖,圓心點(Point),半徑,填充顏色(Scaler),線粗)畫圓函式,線粗預設預設為1
	return imgblur;
}
void function(int event,int x,int y, int flags, void* param)  //滑鼠操作回撥函式
{
	Point center = Point(x,y);    
	if ((flags & CV_EVENT_FLAG_CTRLKEY) && event == EVENT_LBUTTONDOWN)  //ctrl+左鍵,則半徑+10後顯示
	{
		t1 = clock();
		img.copyTo(temp);
		radius += 10;
		temp = my_blur(x,y);
		t2 = clock();					       //計時 clock()程式開始到呼叫次函式經過的計時單元數
		std::cout<<(double)(t2-t1)/CLOCKS_PER_SEC<<std::endl;  // CLOCKS_PER_SEC 每秒單元數(const)
		imshow("Picture",temp);                                //名稱空間沒有加入using namespace std,因此此處使用cout前應加入std::指定名稱空間
	}
	else if(event == EVENT_LBUTTONDOWN)  //左鍵顯示
	{
		t1 = clock();
		img.copyTo (temp);
		temp = my_blur(x,y);
		t2 = clock();
		std::cout<<(double)(t2-t1)/CLOCKS_PER_SEC<<std::endl;
		imshow("Picture",temp);
	}
	else if(event == EVENT_RBUTTONDOWN && (flags & CV_EVENT_FLAG_CTRLKEY))  //ctrl+右鍵,半徑-10後顯示
	{
		t1 = clock();
		img.copyTo(temp);
		radius -= 10;
		temp = my_blur(x,y);
		t2 = clock();
		std::cout<<(double)(t2-t1)/CLOCKS_PER_SEC<<std::endl;
		imshow("Picture",temp);
	}
			
		
		
}
int main()
{
    img = imread("D:/使用者目錄/我的圖片/colorlena.jpg");
	img.copyTo(temp);	
	namedWindow("Picture");
	imshow("Picture",img);

	setMouseCallback("Picture",function);
	createTrackbar("Size","Picture",&value,25,on_Trackbar);
	on_Trackbar(value,0);
	waitKey(0);
	return 0;
}

五、程式執行結果


平均濾波模板8X8


平均濾波模板20X20,明顯變得更模糊


平均濾波模板20X20,半徑變大


平均濾波模板20X20,半徑變小




相關推薦

OpenCV入門放棄筆記

    零cpp基礎的小白探索OpenCV從從入門到放棄的摸魚記錄從這裡開始。     參考書:《OpenCV3程式設計入門》毛星雲、冷雪飛 等編著 電子工業出版社 一、OpenCV(Open Source Computer Vision Library)開源計算機視覺庫

《Mybatis入門到精通》讀書筆記

第三章. Mybatis 註解方式的基本用法 表字段和Java屬性欄位對映的方式: 1. SQL語句中列取別名 2. 設定mapUnderscoreToCamelCase = true(下劃線轉駝峰) 3. resultMap對映 註解方式應用場景不多,不做過多

《Mybatis入門到精通》讀書筆記

第六章. Mybatis高階查詢 在關係型資料庫中,我們經常要處理一對一,一對多的關係。在面對這種關係的時候,我們可能要寫多個方法分別查詢這些資料,然後再組合到一起。這種處理方式特別適合用在大型系統

《Mybatis入門到精通》讀書筆記

第九章. Spring整合Mybaits MyBatis-Spring可以幫助我們將Mybaits程式碼無縫整合到Spring中。使用這個類庫中的類,Spring將會載入必要的Mybaits工廠類和

Python學習3月5號【python編程 入門到實踐】---》筆記2

索引 modified 系列 入門到 忘記 而不是 super 函數 end 1.操作列表     一、遍歷整個列表,並且想對每一個元素執行相同的操作。##這裏就不得不提起我們一直用的For函數了。     二、深入地研究循環     (1)for i in

Python學習3月8號【python編程 入門到實踐】---》筆記1

store 執行 \n true r.js under 進行 一聲 tor 第十章:處理文件和異常 #學習處理文件,讓程序能夠快速地分析大量的數據#學習錯誤處理,避免程序在面對意外情形時崩潰#學習異常,是python創建的特殊對象,用於管理程序運行時出現#學習模塊json

Webpack 4.X 入門到精通 - entry與output

需要 不可 程序猿 導致 import 應用 驗證 解決 doctype 回顧歷史 Web應用日益復雜,前端開發也發生了翻天覆地的變化變得盤根錯節,到今天已經非常復雜和龐大了!用html、css、javascript老老實實的寫個頁面的時代早已過去。而現在要完成工作需要借助

《C#現象到本質》讀書筆記

托管代碼 操作 擁有 底層 不同 使用 子集 存在 基於 最近根據博客園大神的推薦,買了本《C#從現象到本質》。做一點讀書筆記。 由於不懂IL和ldsdm,winddg,太深奧,理解不了,就牛嚼草一樣,先總結第一遍讀書,自己總結的知識點了。不知道這樣會不會侵權,如果侵權了,

Ubuntu16.04CUDA學習筆記GPU背景知識

host:CPU,記憶體 device:GPU,視訊記憶體 我是純粹小白,裡面的一些圖是根據我自己的理解畫的,可能並不一定對 一,GPU和CPU執行程式的區別 (圖片來源:CUDA_C_Programming-Guide) 可以看到GPU有跟多的cores,你可以先把cores理

《Unity Shader入門精要》自學筆記

Shader "Custom/zhudingdian" {Properties {_Diffuse("Diffuse",color) = (1,1,1,1)//用於顏色設定}SubShader {pass{tags{"LightMode" = "ForwardBase"}C

koa2 入門到進階之路

首先我們先來了解一下 Koa 是什麼,https://koa.bootcss.com/,這是 Koa 的官方網站,映入眼簾的第一句就是 Koa -- 基於 Node.js 平臺的下一代 web 開發框架。 在學習 Koa 之前我們應對 Node.js 有一定的基礎,我們都知道: No

Python 爬蟲入門到進階之路

通用爬蟲和聚焦爬蟲 根據使用場景,網路爬蟲可分為 通用爬蟲 和 聚焦爬蟲 兩種. 通用爬蟲 通用網路爬蟲 是 捜索引擎抓取系統(Baidu、Google、Yahoo等)的重要組成部分。主要目的是將網際網路上的網頁下載到本地,形成一個網際網路內容的映象備份。 通用

Java 入門到進階之路

寫在前面:從本片文章開始,將記錄自己學習 Java 的點滴路程,目標定的並不是讓自己成為一個 Java 高手,而是讓自己多掌握一門語言,使自己的知識面更廣一些,在學習 Java 的過程中如有不對的地方還請各位大佬批評指教。 在之前看過一些文章,說網際網路知識到底要學到什麼程度,有人認為不在多而在精,有人認為

springmvc學習筆記 -- 零搭建,基礎入門

out hand char webapp core localhost list ges del 1、新建maven項目 參考mybatis學習筆記(五) -- maven+spring+mybatis從零開始搭建整合詳細過程(上)第一部分,修改配置 2、修

javaweb學習筆記web入門簡介、tomcat

目錄 1.web入門 2.tomcat 2.1 Tomcat的安裝與使用 2.2 Tomcat的目錄結構 2.3 Web應用的目錄結構 1.web入門 B/S (Broswer -Server 瀏覽器端- 伺服器端)架構,其典型應用就是各種網站。它的特點是第一,不

ATP的OpenCV筆記對圖片的基本操作

寫在前面 ATP成功進化成棄坑大師。。 主要是正式開課以後自己亂搞著玩兒的東西就不想管它了QAQ。。。Python學會了以後也懶得往部落格裡寫了。。 這次打算開的坑emmm是上課講的內容?由於要記住的函式用法太多ATP懶得每次遇到都百度所以相當於在blog裡面記一下嗯就是這樣。 OpenCV是個可以用

Scala學習筆記入門

變數定義 Scala有兩種變數,val和var。val類似於Java中的final變數,一旦初始化了,val就不能再被賦值。var可以多次賦值。但由於函數語言程式設計特性,Scala更推崇val。 var的使用也有其侷限性,Scala有型別推斷的功能,當var被初始化後,其型別就已經被斷定,比如 當m被

數字影象處理筆記利用OpenCV的Cameo框架搭建實驗環境

1 - 引言 Python的應用程式可以通過面向物件的方法來實現,OpenCV提供了一個Cameo框架可以捕捉電腦的攝像頭。我們可以通過編寫新增框架裡的類和方法來對攝像頭捕捉到的畫面進行影象處理和實驗,是一個很好的學習方法,下面讓我們來搭建一下這個Cameo框架 2 - 使用mana

PHP學習筆記PHP入門

1.1  PHP概述 1.1.1   PHP是什麼       PHP(Hypertext  Preprocessor,超文字前處理器)是一種伺服器端、跨平臺、HTML嵌入式的指令碼語言。 1.1.2   PHP語言的優勢 速度快                   

vue入門到女裝??零開始搭建後臺管理系統安裝框架

安裝及執行都是基於node的,不會node的可以自行百度,網上教程很多,也不難 專案效果預覽: demo1 demo2 原始碼下載 開始安裝框架: vue element-ui   注意如果報錯安裝失敗就重新安裝,不然雖然本地有element的依賴包但是可能會出一些奇怪的錯誤 另外element-ui