c#計算機視覺庫openCVSharp

做爲研究計算機視覺的一員,你們確定對Intel大名鼎鼎的openCV系列計算機視覺庫耳熟能詳,對於不少人來講openCV甚至已經成爲其項目研究不可缺乏的一部分。可是,因爲項目兼容性的要求、openCV的GUI功能不夠豐富等緣由不少人但願可以在C#環境中使用openCV。
在目前針對c#的計算機視覺庫主要有兩種,EmguCV和openCVSharp。
Emgucv的優點在於不單單提供了計算機視覺函數接口而且提供了一系列界面控件接口,但目前只支持openCV1的書寫風格。
openCVSharp提供了openCV和openCV2兩種書寫風格,而且和openCV的imagewatch同樣,提供了一種簡單有效的調試工具Debugger Visualizer,具體使用可見一下網址
https://github.com/shimat/opencvsharp/wiki/Debugger-Visualizer。
在這裏個人推薦是使用openCVSharp,在這裏主要考慮的是協議方面的問題。opencv的協議是BSD協議,這是對開發者來講是至關友好的協議;網上常見的免費版EmguCV則是GUN協議,任何發表都須要至少公佈你的源代碼;openCVSharp則是相對溫和多的LGUN協議,這個協議和QT是差很少相同的,甚至當你不使用自帶的DLL時,和openCV同樣是BSD協議(若是你對協議感興趣的話能夠自行百度)。
具體配置方法能夠自行百度,簡單來講就是添加相應的com組件(注意有一個com組件右鍵添加,只能手動放在相應的exe目錄下),而後添加相應的命名空間。
下面分別是c和c++風格的代碼,獲取相應位置像素值,速度由慢向快排列。c++

//c風格代碼
//方案一
IplImage img = new IplImage("baz.png", LoadMode.Color);git

for (int y = 0; y < img.Height; y++) {
for (int x = 0; x < img.Width; x++) {
CvColor c = img[y, x];
img[y, x] = new CvColor() {
B = (byte)Math.Round(c.B * 0.7 + 10),
G = (byte)Math.Round(c.G * 1.0),
R = (byte)Math.Round(c.R * 0.0),
};
}
}github

//方案二
IplImage img = new IplImage("baz.png", LoadMode.Color);c#

unsafe {
byte* ptr = (byte*)img.ImageData;
for (int y = 0; y < img.Height; y++) {
for (int x = 0; x < img.Width; x++) {
int offset = (img.WidthStep * y) + (x * 3);
byte b = ptr[offset + 0]; // B
byte g = ptr[offset + 1]; // G
byte r = ptr[offset + 2]; // R
ptr[offset + 0] = r;
ptr[offset + 1] = g;
ptr[offset + 2] = b;
}
}
}函數

方案三
IplImage img = new IplImage("baz.png", LoadMode.Color);
IntPtr ptr = img.ImageData;工具

for (int x = 0; x < image.Width; x++) {
for (int y = 0; y < image.Height; y++) {
int offset = (image.WidthStep * y) + (x * 3);
byte b = Marshal.ReadByte(ptr, offset + 0); // B
byte g = Marshal.ReadByte(ptr, offset + 1); // G
byte r = Marshal.ReadByte(ptr, offset + 2); // R
Marshal.WriteByte(ptr, offset, r);
Marshal.WriteByte(ptr, offset, g);
Marshal.WriteByte(ptr, offset, b);
}
}

//c++風格代碼
//方案一
Mat mat = new Mat("lenna.png", LoadMode.Color);.net

for (int y = 0; y < mat.Height; y++)
{
for (int x = 0; x < mat.Width; x++)
{
Vec3b color = mat.Get<Vec3b>(y, x);
byte temp = color.Item0;
color.Item0 = color.Item2; // B <- R
color.Item2 = temp; // R <- B
mat.Set<Vec3b>(y, x, color);
}
}
GenericIndexer (reasonably fast)調試

//方案二
Mat mat = new Mat("lenna.png", LoadMode.Color);blog

var indexer = mat.GetGenericIndexer<Vec3b>();
for (int y = 0; y < mat.Height; y++)
{
for (int x = 0; x < mat.Width; x++)
{
Vec3b color = indexer[y, x];
byte temp = color.Item0;
color.Item0 = color.Item2; // B <- R
color.Item2 = temp; // R <- B
indexer[y, x] = color;
}
}接口

方案三
Mat mat = new Mat("lenna.png", LoadMode.Color);

MatOfByte3 mat3 = new MatOfByte3(mat); // cv::Mat_<cv::Vec3b>
var indexer = mat3.GetIndexer();

for (int y = 0; y < mat.Height; y++){ for (int x = 0; x < mat.Width; x++) { Vec3b color = indexer[y, x]; byte temp = color.Item0; color.Item0 = color.Item2; // B <- R color.Item2 = temp; // R <- B indexer[y, x] = color; }}最後,openCVSharp下載地址爲https://github.com/shimat/opencvsharp/releases。若是,沒法下載私信我,我能夠提供2.4.十、3.1和3.2三種版本。--------------------- 做者:小立1991 來源:CSDN 原文:https://blog.csdn.net/qq_21400315/article/details/52451941 版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索