Opencv開發筆記五 畫素的讀寫(一)

2021-08-28 16:37:37 字數 3384 閱讀 8645

一、講講什麼是畫素

畫素是指由影象的小方格即所謂的畫素(pixel)組成的,這些小方塊都有乙個明確的位置和被分配的色彩數值,這些小方塊內放的數和所放的位置據決定了影象在某個位置所顯示的顏色,比如某一塊區域放的都是數字0(255),則該片區域會顯示出黑色(白色),可以將畫素視為整個影象中不可分割的單位或者是元素,不可分割的意思是它不能夠再切割成更小單位抑或是元素,它是以乙個單一顏色的小方格形式存在。所以就可以把影象的畫素對應的放在影象的某個位置看成乙個大的矩陣,矩陣中的每個元素就是這些小方格值的大小。相機所說的畫素,其實是最大畫素,畫素是解析度的單位,這個畫素值僅僅是相機所支援的有效最大解析度,要獲取影象的畫素就要獲取矩陣的每乙個元素,所有讀寫畫素要求遍歷矩陣的每乙個元素。

二、如何訪問畫素

open提供多種方法來訪問影象的畫素,這裡講三種方式:

(1)cv::mat的at函式

at()函式對矩陣中某個畫素進行讀取,可以相當方便,但是效率一般

之前知道複製乙個可以方便的通過,src.copyto(dst)  或者  dst = src.clone(); 方便的實現,但是怎麼通過獲取畫素操作呢?

請看下面:

#include #include using namespace cv;

using namespace std;

int main(int argc, char **argv)

mat dstimage(srcimage.size(), srcimage.type()); // dst影象和src影象大小型別相同

int channels = srcimage.channels(); // srcimage的通道數

// 遍歷獲取影象的每乙個畫素

for (int row = 0; row < srcimage.rows; row++)

else if(channels == 1)

}} namedwindow("src", cv_window_autosize);

namedwindow("dst", cv_window_autosize);

imshow("src", srcimage);

imshow("dst", dstimage);

waitkey(0);

return 0;

}

再看下面的方式,僅僅是通道數不同,目標生成的顏色就很大的不同

// 建立的單通道的影象

int main(int argc, char **argv)

else if (channels == 1)

} }namedwindow("src", cv_window_autosize);

namedwindow("dst", cv_window_autosize);

imshow("src", srcimage);

imshow("dst", dstimage);

waitkey(0);

return 0;

}// 建立的是三通道的彩色

int main(int argc, char **argv)

else if (channels == 1)

} }namedwindow("src", cv_window_autosize);

namedwindow("dst", cv_window_autosize);

imshow("src", srcimage);

imshow("dst", dstimage);

waitkey(0);

return 0;

}

src的都是

dst的前者:

dst的後者:

(1)ptr指標訪問

vec3b * cur = srcimage.ptr(i);  // 訪問第i行的首元素的指標  用於多通道  vec3b可以換成具體的型別 看下方**

uchar* cur = srcimage.ptr(i);  // 訪問第i行的首元素的指標    用於單通道

int main(int argc, char **argv)

if (channels == 1)

} }namedwindow("src", cv_window_autosize);

imshow("src", srcimage);

waitkey(0);

return 0;

}

opencv中有模板類vec,可以表示乙個向量

typedef vecvec2d;

typedef vecvec3d;

typedef vecvec4d;

typedef vecvec6d;

typedef vecvec2b;

typedef vecvec3b;

typedef vecvec4b;

typedef vecvec2s;

typedef vecvec3s;

typedef vecvec4s;

typedef vecvec2i;

typedef vecvec3i;

typedef vecvec4i;

typedef vecvec2f;

typedef vecvec3f;

typedef vecvec4f;

typedef vecvec6f;

(3)迭代器訪問

opencv 的迭代器 提供了

matiterator_iter_gray;  // 訪問單通道

matiterator_iter_color;  // 訪問3通道  vec3b可以修改 具體看影象型別 檢視vec類

// 迭代器訪問

int main(int argc, char **argv)

matiterator_iter_color;

for (iter_color = color.begin(); iter_color != color.end(); iter_color++)

namedwindow("gray", cv_window_autosize);

imshow("gray", gray);

imshow("color", color);

waitkey(0);

return 0;

}

Spring專案開發筆記系列(五)

spring專案開發筆記系列 五 hibernate持久化類的annotation方式配置 spring的這個專案中主要用的配置檔案就前面這麼幾個web.xml,spring config.xml和struts config.xml,其它的配置檔案比如log4j.properties,validat...

PHP微信公眾開發筆記 五

日期 2014.9.3 今天做了身份驗證的功能,然後完善了下搜尋功能。其實主要的是將整個 結構整理了一番,應該可以說是模組化設計吧。因為我們之前提的功能需求中有 1 選單 查詢功能。我考慮到後期功能的擴充套件,就想將這些分模組來實現 選單模組 這樣,今後我們需要新增新的選單功能,可以直接在這個模組裡...

Energy的開發筆記

演化為 foreach jobjiect jo in ja string jsontext jsonreader reader new jsontextreader new stringreader jsontext while reader.read 陣列型資料 三 對不同儀表裝置的呼叫方法與結果...