1. Что такое GOCW?
Чтобы решить проблему написания программ OpenCV на C#, я провёл глубокое исследование и реализовал эффективный и доступный метод GreenOpenCsharpWrapper (GOCW). Этот метод позволяет отделить интерфейс от бизнес-логики, эффективно выполнять вызовы алгоритмов и легко поддерживать алгоритмы. Можно сказать, что это результат моего многолетнего опыта работы над проектами.
Адрес публикации GOCW: https://gitee.com/jsxyhelu2020/gocw.
2. Особенности GOCW:
3. Использование GOCW
Скачайте gocw_master, после распаковки получите два каталога файлов. GOCW — это файл библиотеки классов, а WINFORM_DEMO — пример ссылки. Откройте WINFORM_DEMO.sln (или создайте новое приложение winform) в Visual Studio 2017 или более поздней версии и добавьте ссылку на GOCW в разделе «Ссылки».
Обратите внимание:
4. Тестовый код
Вы можете напрямую обратиться к WINFROM_DEMO и добавить заголовок файла GOCW.
using GOCW;
Напишите код для вызова GOCW, вы также можете поместить определение клиента в форму по мере необходимости. Вам нужно будет изменить адрес lena в соответствии с вашими потребностями.
Пример кода:
private void button1_Click(object sender, EventArgs e)
{
Bitmap bmp = (Bitmap)Bitmap.FromFile("e:/template/lena.jpg");
GOCWClass client = new GOCWClass();
// Вызов алгоритма обработки изображений
MemoryStream ms = new MemoryStream();
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
Bitmap bitmap = client.testMethod(bytes);
pictureBox1.Image = bitmap;
}
Этот код реализует изменение «оттенка серого».
5. Краткое описание принципа работы
GOCW вызывает функции через CLR. Здесь мы не будем подробно описывать принцип работы CLR. Важно отметить, где именно вы добавляете алгоритм обработки изображений. Откройте файл GOCW.h.
Пример:
#pragma once
#include "opencv.hpp"
#using <system.drawing.dll>
using namespace System;
using namespace System::Data;
using namespace System::IO;
using namespace System::Drawing;
using namespace System::Drawing::Imaging;
using namespace std;
namespace GOCW {
public ref class GOCWClass
{
public:
///// Пример функции //////
//1. Передача изображения
/* MemoryStream ms = new MemoryStream();
b.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
Bitmap bitmap = client.testMethod(bytes);*/
Bitmap^ GOCWClass::testMethod(cli::array<unsigned char>^ pCBuf1);
//2. Ссылка на передачу int
/*unsafe
{
int* value = stackalloc int[1];
value[0] = 0;
int iret = client.allTest(2, 3, value);
}*/
int GOCWClass::allTest(int a, int b, int* c);
//3. Ссылка на передачу строки
System::String^ GOCWClass::allTestStr(System::String^ inputStr);
///// Бизнес-функции //////
/*unsafe
{
int* value = stackalloc int[1];// Возвращаемый код
value[0] = 0;
bitmap = client.fetchresult(bytes, value);// Вызов алгоритма обработки изображения из GOCClrClasslibrary
if (value[0] == 0)//0 верно 1 неверно
{
res = true;
}
else
{
res = false;
}
}*/
Bitmap^ GOCWClass::fetchresult(cli::array<unsigned char>^ pCBuf1, int* errorCode);
};
}
}
Здесь мы объявляем различные методы реализации в виде «бутерброда», а их реализация находится в файле GOCW.cpp. Например, рассмотрим один из методов.
Пример:
//1. Передать изображение
Bitmap^ GOCWClass::testMethod(cli::array<unsigned char>^ pCBuf1)
{
//////////////////////////////// Преобразование входного cli::array<unsigned char> в cv::Mat /////////////////////////
pin_ptr<System::Byte> p1 = &pCBuf1[0];
unsigned char* pby1 = p1;
cv::Mat img_data1(pCBuf1->Length, 1, CV_8U, pby1);
cv::Mat img_object = cv::imdecode(img_data1, cv::IMREAD_UNCHANGED);
if (!img_object.data)
return nullptr;
///////////////////////////////// Алгоритм обработки OpenCV //////////////////////////////////////////
Mat draw = img_object.clone();
cvtColor(draw, draw, COLOR_BGR2GRAY);
cvtColor(draw, draw, COLOR_GRAY2BGR);
///////////////////////// Преобразовать cv::Mat в Bitmap (можно передавать только данные формата cv_8u3) /////////////////////////////////
if (!draw.data)
return nullptr;
Bitmap^ bitmap = MatToBitmap(draw);
return bitmap;
}
В этом коде:
Mat draw = img_object.clone();
cvtColor(draw, draw, COLOR_BGR2GRAY);
cvtColor(draw, draw, COLOR_GRAY2BGR);
это конкретная бизнес-функция, которую можно изменить в соответствии с требованиями алгоритма. Подробные сведения о передаче параметров см. в других функциях.
6. Предварительные выводы
Хотя GOCW немного сложнее, чем OpenCVSharp, он может лучше интегрироваться с существующими системами, и его преимущества очевидны. Если вы разработчик, работающий с изображениями, и вам нужна платформа для алгоритмов, то GOCW с его обёрткой на основе CLR, вероятно, подойдёт вам!
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )