OpenCvSharp實(shí)現(xiàn)Mat對(duì)象簡(jiǎn)單的像素操作
1: 輸出一個(gè)Mat對(duì)象的像素
自定義一個(gè)Mat 對(duì)象,然后輸出像素值(像素值基本都在 0 – 255 之間 ,圖像為三通道)
代碼
public static void F1()
{
Scalar s = new Scalar(0, 0, 255); //定義一個(gè)三通道顏色(紅色)
Mat m = new Mat(100, 100, MatType.CV_8UC3, s); //矩陣數(shù)據(jù)類型(深度和通道數(shù)) MatType
/*
* 小圖像的每一個(gè)像素值我們都是知道的,可以輸出查看,驗(yàn)證算法正確性,然后在ran大圖
*/
//打印 100 * 100 Mat對(duì)象像素值
for (int i = 0; i < m.Height; i++)
{
for (int j = 0; j < m.Width; j++)
{
Vec3b color = m.Get<Vec3b>(i, j); //new Vec3b(); 顏色通道類型 (字節(jié)的三元組),直接視同Get泛型方法返回指定類型
//單獨(dú)獲取指定通道像素
//color.Item0= m.Get<Vec3b>(i, j).Item0; //R
//color.Item1 = m.Get<Vec3b>(i, j).Item1; //G
//color.Item2 = m.Get<Vec3b>(i, j).Item2; //B
Console.Write(color.Item0 + " " + color.Item1 + " " + color.Item2);
Console.WriteLine(" "); //輸出一個(gè)換行
}
}
using (new Window("M", WindowMode.AutoSize, m))
{
Cv2.WaitKey(0);
}
}

100*100 個(gè)像素大小的圖像不是很大,顏色在代碼值指定了(0,0,255)三通道的顏色值,打印出來都只是(0,0,255)。
下面讀取一張彩色圖片試一下:
public static void F1(string path)
{
//Scalar s = new Scalar(0, 0, 255);
//Mat m = new Mat(100, 100, MatType.CV_8UC3, s); //矩陣數(shù)據(jù)類型(深度和通道數(shù)) MatType
Mat m = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth);
/*
* 小圖像的每一個(gè)像素值我們都是知道的,可以輸出查看,驗(yàn)證算法正確性,然后在ran大圖
*/
//打印 100 * 100 Mat對(duì)象像素值
for (int i = 0; i < m.Height; i++)
{
for (int j = 0; j < m.Width; j++)
{
Vec3b color = m.Get<Vec3b>(i, j); //new Vec3b(); 顏色通道類型(字節(jié)的三元組) ,直接視同Get泛型方法返回指定類型
//單獨(dú)獲取指定通道像素
//color.Item0= m.Get<Vec3b>(i, j).Item0; //R
//color.Item1 = m.Get<Vec3b>(i, j).Item1; //G
//color.Item2 = m.Get<Vec3b>(i, j).Item2; //B
Console.Write(color.Item0 + " " + color.Item1 + " " + color.Item2);
Console.WriteLine(" "); //輸出一個(gè)換行
}
}
Console.WriteLine("圖像高度:{0}", m.Height);
Console.WriteLine("圖像寬度:{0}", m.Width);
using (new Window("M", WindowMode.AutoSize, m))
{
Cv2.WaitKey(0);
}
}

這張圖比較大,輸出像素要費(fèi)點(diǎn)時(shí)間,最后輸出了圖像的高度和寬度 480 * 512 =245760 多個(gè)像素點(diǎn)。 像素點(diǎn)的值 都在0 --255之間且是正數(shù)。
2:使用指針獲取一個(gè)像素值和圖像的行列值
代碼 在C#中使用指針方法要加 unsafe , Main函數(shù)也要加
unsafe static void Main(string[] args)
{
string imagePath = @"E:\image\lenna.png"; //圖片加載路徑
Function1(imagePath);
}
/// <summary>
/// 操作指針要加 unsafe
/// </summary>
unsafe public static void Function1(string path)
{
Mat src = new Mat(path, ImreadModes.AnyColor);
if (src.Empty()) //判斷 MAT對(duì)象是否為空,不過在C#中好像沒用,因?yàn)樵趍at對(duì)象初始化的時(shí)候找不到圖片就直接拋出異常了,但是C++中可以用來判斷。
{
Console.WriteLine("加載圖像出錯(cuò)");
return;
}
/*
C++:
Mat dst;
dst=Mat(src.Size(), src.Type());
dst=Scalar(127,0,255);
*/
//Scalar s = new Scalar(127, 0, 255); //創(chuàng)建一個(gè)顏色標(biāo)量(RED)C# 中是一個(gè)對(duì)象
// Mat dst = new Mat(src.Size(), src.Type(),s);//創(chuàng)建一個(gè)與src 的大小和類型一直的圖片矩陣
//Mat dst = src.Clone(); //克隆:得到一個(gè)完全拷貝的對(duì)象
Mat dst = new Mat();
src.CopyTo(dst); //拷貝一個(gè)與克隆類似,但是dst必須先new出來
//Cv2.CvtColor(src, dst, ColorConversionCodes.BGRA2GRAY); //轉(zhuǎn)為灰度圖
Console.WriteLine("InputImage 顏色通道:{0}", src.Channels()); //顏色通道數(shù)
Console.WriteLine("Create 顏色通道:{0}", dst.Channels()); //顏色通道數(shù)
//指針獲取值(根據(jù)下標(biāo)),第一個(gè)像素值
IntPtr c = dst.Ptr(0); //Mat對(duì)象的 Ptr方法:返回指向指定矩陣行的指針。
byte* c1 = (byte*)c; //像素值在C#中是byte類型 ,在C++中是 uchar類型
//byte* cc = (byte*)dst.Ptr(0);
Console.WriteLine("第一個(gè)像素值:{0}", *c1);
int row = dst.Rows; //行
int clo = dst.Cols; //列
Console.WriteLine("Rows :{0} ;Cols :{1}", row, clo);
using (new Window("Create", WindowMode.FreeRatio, dst))
using (new Window("InputImage", WindowMode.FreeRatio, src))
{
Cv2.WaitKey(0);
}
}

到此這篇關(guān)于OpenCvSharp實(shí)現(xiàn)Mat對(duì)象簡(jiǎn)單的像素操作的文章就介紹到這了,更多相關(guān)OpenCvSharp Mat對(duì)象像素操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用WMI實(shí)現(xiàn)監(jiān)聽進(jìn)程的啟動(dòng)和關(guān)閉
Windows Management Instrumentation(WMI)是用于管理基于 Windows 操作系統(tǒng)的數(shù)據(jù)和操作的基礎(chǔ)結(jié)構(gòu),本文將使用WMI實(shí)現(xiàn)監(jiān)聽進(jìn)程的啟動(dòng)和關(guān)閉,感興趣的可以了解下2024-01-01
詳解C#讀取Appconfig中自定義的節(jié)點(diǎn)
我們往往需要在App.config中自定義一些節(jié)來滿足實(shí)際需要,而不依賴于App.config的appSettings,下面通過一個(gè)簡(jiǎn)單的實(shí)例來說明自定義配置節(jié)點(diǎn)的設(shè)置與讀取2015-06-06
c#數(shù)據(jù)綁定之將datatabel的data添加listView
這篇文章主要介紹了c#將DataTabel的data添加ListView的示例,實(shí)現(xiàn)功能是通過響應(yīng)UI Textbox 的值向ListView 綁定新添加的紀(jì)錄。 ,需要的朋友可以參考下2014-04-04
C#將配置文件appsetting中的值轉(zhuǎn)換為動(dòng)態(tài)對(duì)象調(diào)用
這篇文章主要介紹了將配置文件appsetting中的值轉(zhuǎn)換為動(dòng)態(tài)對(duì)象調(diào)用 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
將數(shù)組中指定數(shù)量的元素移動(dòng)數(shù)組后面的實(shí)現(xiàn)代碼
本篇文章是對(duì)將數(shù)組中指定數(shù)量的元素移動(dòng)數(shù)組后面的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
C#?基于NAudio實(shí)現(xiàn)對(duì)Wav音頻文件剪切(限PCM格式)
本文主要介紹了C#基于NAudio工具對(duì)Wav音頻文件進(jìn)行剪切,可以將一個(gè)音頻文件剪切成多個(gè)音頻文件(限PCM格式),感興趣的小伙伴可以學(xué)習(xí)一下2021-11-11
C# 9 新特性——record的相關(guān)總結(jié)
這篇文章主要介紹了C# 9 新特性——record的相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用c# 9的新特性,感興趣的朋友可以了解下2021-02-02

