1. 程式人生 > >opencv2中對影象ROI的理解及遍歷操作

opencv2中對影象ROI的理解及遍歷操作

自己也是剛學opencv2不久,做的是關於目標檢測的一些研究,在平時寫程式碼的過程中發現自己對ROI的理解總是不夠深入。所以總結了一下《opencv2計算機視覺程式設計手冊》的內容以及寫程式碼過程中的心得,想和大家一同分享。     在使用ROI時首先要定義ROI,之後,ROI便可以被當做一個普通的cv::Mat來處理了,而關鍵之處是ROI和他的父影象指向同一塊快取區域。這句話也說明,建立ROI時不會拷貝資料,但對ROI的任何變換都會影響到原始影象的對應區域。     下面是程式程式碼:
<pre name="code" class="cpp"><span style="font-size:18px;">#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;  
using namespace cv; 
void readimageinat(Mat &image);


int main()
{
	Mat image = imread("boldt.jpg");//載入圖片
	Mat grayframe;
	if (!image.data)//測試是否載入
	{
		cout<<"fail to open!"<<endl;
	}
	if (image.channels() == 3)//變為灰度影象
	{
		cvtColor(image,grayframe,CV_RGB2GRAY);
	}
	if (!grayframe.data)
	{
		cout << "影象未建立"<<endl;
	}
	cout << "image.rows = "<< image.rows <<endl; //360//獲得影象的大小
	cout << "image.cols = "<< image.cols <<endl; //480
	Mat imageROI;//定義和初始化ROI區域,而且Rect()範圍需要根據實際情況選取</span>
<span style="font-size:18px;">        int roiup = 20;
<span style="white-space:pre">	</span>int roidown = 30;
<span style="white-space:pre">	</span>int roileft = 20;
<span style="white-space:pre">	</span>int roiright = 30;
	imageROI = grayframe(Rect(roiup,roileft,roidown,roiright));
	//通過圓來測試roi的工作原理
	//圓心
	Point center = Point(10,10);
	//半徑
	int r = 10;
	circle(imageROI,center,r,Scalar(0,0,0));//在ROI上畫圓
	readimageinat(imageROI);
	//readimageinat(grayframe);

	imshow("grayframe",grayframe);//顯示和儲存圖片
	imwrite("grayframe.jpg",grayframe);
	imshow("imageROI",imageROI);
	imwrite("imageROI.jpg",imageROI);
	waitKey(0);
}</span>

            其中第一幅是原始圖片,第二幅是ROI圖片,通過在ROI上操作,會改變原始影象。重要的是,在定義了ROI後,即可把它當做新的影象來操作。     在遍歷ROI時,完全可以把ROI當做一幅新的影象來處理,以下面函式為例,用Mat的成員函式at()來測試ROI的遍歷效果。
<span style="font-size:18px;">void readimageinat(Mat &image)
{
	for (int i = 0;i < image.rows; i++)
	{ 
		cout << "i  = "<< i << " ";
		for (int j = 0;j <image.cols; j++)
		{
			image.at<uchar>(j) = 0;
		}
		cout << endl;
	}

}</span><span style="font-size: 24px;">
</span>

相關推薦

opencv2影象ROI理解操作

自己也是剛學opencv2不久,做的是關於目標檢測的一些研究,在平時寫程式碼的過程中發現自己對ROI的理解總是不夠深入。所以總結了一下《opencv2計算機視覺程式設計手冊》的內容以及寫程式碼過程中的

0010-OpenCV影象或矩陣元素的四種方法

影象的點或矩陣中的元素,是我們進行運算時的基本元素,所以遍歷影象的操作是經常要用到的,本文的程式碼用四種方式實現影象的遍歷。 我們通過元素遍歷實現對影象降色彩處理,因為256*256*256種顏色實在太多了,在影象顏色聚類或繪製彩色直方圖時,我們需要用一些代表性的顏色代替豐富的色彩空間,此時可以

【unity3d-C#學習筆記】C#常用的資料結構方法

常用的集合類:ArrayList,Queue,Stack,SortedList,Hashtable 陣列: Array: 1.資料儲存在連續的記憶體上。 2.陣列的語速都是同類型的。 3.陣列

【資料結構】3-1 二叉樹的先序建立操作

二叉樹真的令人頭大 #include<iostream> using namespace std; template <class T> struct BTNode//二叉連結串列結點結構 { T data; //二叉樹中的元素 BTNode<T>

js兩個陣列的迴圈操作

最近需要這樣一個需求,例如 <script type="text/javascript"> var ceshi = ["主臥","次臥","客廳"]; var ceshi2 = [{ tag:0, name:"客廳", isShow:false

資料結構實踐專案——圖的基本運算操作

本文是針對[資料結構基礎系列(7):圖]中第1-9課時的實踐專案。 0701 圖結構導學 0702 圖的定義 0703 圖的基本術語 0704 圖的鄰接矩陣儲存結構及演算法 0705 圖的鄰接表儲存結構及演算法 0706 圖的遍歷 0707 非連通

淺談xmpp的理解應用

mpp 通信 new xmpp times div log 傳輸數據 重新 參考原文鏈接 http://blog.sina.com.cn/s/blog_69f68f880102uyeg.html 一、xmpp是基於xml的協議。具有遵循標準,有安全性,使用TCP傳的xml的

新增超連結的命令是什麼?在AutoCAD影象怎麼新增超連結?

可能很多的小夥伴們還不知道,AutoCAD圖紙檔案並不只是一張圖紙檔案而已,他除了可以新增一些world文件還有Excel資料表之外,還能相應的進行插入連結,新增超連結需要用到的命令是HYPERLINK,或者在插入面板上點選超連結的符號,亦或用快捷鍵CTRL+K。 第一步:我們在電腦桌面上

JavaScriptthis的理解

解析 : person.details.print()是details呼叫了print(),所以print()中的this 指向details,即: 2, person.print(),this 是指向person 的,即: 3 . var name1 =

JSON格式的資料(點語法和括號的區別)

JSON格式的資料及遍歷(點語法和中括號的區別) 在遍歷物件的時候,要使用[""]的形式 點語法不可以跟變數 https://blog.csdn.net/yingzizizizizizzz/article/details/78327641 var

python+OpenCV影象處理(十二)車牌定位影象的形態學組合操作處理

車牌定位中對影象的形態學組合操作處理 所謂的車牌定位,其中最關鍵的部分就是對圖片的處理,引數的設定,並使之擁有泛化能力。 首先傳入圖片,在進行大規模的圖片處理時,因為無法確定圖片的尺寸,所以需要將原始圖片進行等比例的縮放。 orgimg = cv2.imread('ch

koa框架next()的理解

const one = (ctx, next) => { console.log('>> one'); next(); console.log('<< one'); } const two = (ctx, next) => {

C++程式設計緩衝區的理解(OS預設4096大小的緩衝區,有例子,很形象)

什麼是緩衝區        緩衝區又稱為快取,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。       緩

[work] Linux Shell的陣列

在Linux下使用shell的時候,為方便起見,偶爾會用到一下陣列。陣列的申明方式是: [java] view plain copy array=(element1 element2 element3 .... elementN)   也就是直接用圓括號包陣列元素包起來,陣

pytorch影象的基本操作

Pytorch提供了一個torchvision.transforms的包,可以使用transforms進行如下操作: 1、PIL.image / numpy. ndarray 與Tensor相互轉化 2、進行歸一化 3、對PIL.image進行裁剪、縮放等操作 一、PIL.ima

OpenCV影象進行二維離散傅立葉變換

#include<opencv2/opencv.hpp> #include <highgui.h> #include <iostream> #include <cv.h> #include <opencv2/core/c

linuxsocket的理解 socket高併發

1.socket是什麼? 其實準確的來說,socket並不僅僅用於linux而已,它也應用於TCP/IP中。籠統的來說,socket就是指的“IP地址+埠號”。比如我有一個ssh伺服器A,這時候我有兩個終端通過ssh協議登陸到伺服器A上面,那麼這時候伺服器上建立的socket連線數就是2個,那麼這

OpenCV學習筆記(14):形態學濾波影象進行邊緣角點檢測

</pre><pre name="code" class="cpp">#include "stdafx.h" #include<opencv2/opencv.hpp> using namespace cv; class MorphoFe

opencv影象畫素點訪問的三種方法利用程式進行解讀

程式碼放到自己的工程中,執行就可以的 #include <opencv2\opencv.hpp> #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #includ

JAVA象的克隆深拷貝和淺拷貝

output err 解釋 深拷貝和淺拷貝 color 賦值語句 的區別 num article 使用場景: 在日常的編程過程 中,經常會遇到,有一個對象OA,在某一時間點OA中已經包含了一些有效值 ,此時可能會需一個和OA完全相對的新對象OB,並且要在後面的操作中對OB