opencv學習筆記之Mat元素訪問

2021-09-24 14:21:17 字數 3287 閱讀 4322

mat元素訪問方法如下

//declare

template

_tp& cv:

:mat::at

(int i0 =

0)

cv:

:mat h

(100

,100

, cv_64f)

;//初始化

for(

int i =

0; i < h.rows; i++

)for

(int j =

0; j < h.cols; j++

) h.at<

double

>

(i,j)=1.

/(i+j+1)

;//賦值

優點:直觀好理解

缺點:訪問速度相對慢

**如下

cv:

:mat src

(100

,100

, cv_64f)

;//初始化

int width = src.cols;

int height = src.rows;

int step = src.step;

const

float

* sptr =

(float

*)src.data;

step /

=sizeof

(*sptr)

;for

(int i =

0; i < height; i++)}

enum imreadmodes

;

/*

//use g++ to build

g++ read_mat.cpp -o read -std=c++11 -lopencv_core -lopencv_imgproc -lopencv_highgui

*/#include

#include

#include

#ifdef _win32

#include

/* _access */

#include

/* _mkdir */

#else

#include

/* access */

#include

/*mkdir*/

#endif

#include

using namespace cv;

using namespace std;

#define isshowat 1

intmain

(int argc,

char

* ar**)

int width = image.cols;

//寬int height = image.rows;

//高//如果定義了巨集等於1,則使用at訪問,否則使用位址指標訪問

#if isshowat

vec3b tmp;

cv::mat new_image = cv:

:mat:

:zeros

(image.

size()

, image.

type()

);for(

int r =

0; r < height; r++)}

cv::imshow

("new_image"

, new_image)

; cv:

:waitkey(0

);#else

int step = image.step;

//每一行包含的位元組數

//cout << image.type() << endl; //cv_8uc3

//cout << "image.step "<< image.step << endl; //

//定義指向矩陣資料的記憶體位址的指標,首先得知道資料元素的型別,

//正常的rgb的影象型別為cv_8uc3,灰度圖為cv_8uc1

const uchar* imgptr =

(uchar*

)image.data;

cout <<

sizeof

(*imgptr)

<< endl;

//輸出單一通道的位元組數=1,預設與image.elemsize1()相等

step /

=sizeof

(*imgptr)

;//每一行總的通道單元數

// 每個元素大小,單位是位元組 例type是cv_16sc3,那麼elemsize = 3 * 16 / 8 = 6 bytes

cout <<

"elemsize:"

<< image.

elemsize()

<< endl;

// 8*3/8=3

// 每個通道大小,單位是位元組

cout <<

"elemsize1:"

<< image.

elemsize1()

<< endl;

//1//建立檔案物件,儲存的值

errno_t err;

file *fp;if(

(err =

fopen_s

(&fp,

"result.txt"

,"w"))

!=0)printf

("the file 'result.txt' was not opened\n");

else

printf

("the file 'result.txt' was opened\n");

//file *fp = fopen("result.txt", "w");

//if (fp == null)

cv::mat same = cv:

:mat:

:zeros

(image.

size()

,cv_8uc3)

;for

(int i =

0; i < height; i++

)fprintf

(fp,

"\n");

}fclose

(fp);

cv::imwrite

("same.png"

, same)

;#endif

getchar()

;return0;

}

OpenCV 學習筆記(一)Mat

opencv是由c語言實現的,實際上它使用的結構體也是遵循物件導向思想設計的,iplimage由cvmat派生 資訊 和乙個指向儲存所有畫素值的矩陣 根據所選儲存方法的不同矩陣可以是不同的維數 的指標。mat矩陣頭 包括 typedef struct cvmat data ifdef cpluspl...

OpenCV中Mat 型別學習筆記

printf img.size 函式返回值 n cout 報錯 原因,mat.step1 0 需要用圓括弧 mat的step,size,step1,elemsize,elemsize1這幾個屬性非常容易混淆。opencv的官方參考手冊也沒有解釋清楚這幾個概念。step1 i 每一維元素的通道數 st...

OpenCV學習筆記七 關於Mat類

1 建立乙個mat物件僅僅是建立了資訊頭部分,並沒有複製影象矩陣,而是通過矩陣指標指向某一位址而實現。eg mat a,c 僅建立資訊頭部分 mat b a 使用拷貝建構函式 c a 賦值運算子 以上建立的所有mat物件最終都指向同乙個也是唯一的乙個資料矩陣。雖然資訊頭不同,但是通過任何乙個物件所做...