1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/jsxyhelu2020-gocw

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

В C# с использованием OpenCV (с использованием GOCW)

1. Что такое GOCW?

Чтобы решить проблему написания программ OpenCV на C#, я провёл глубокое исследование и реализовал эффективный и доступный метод GreenOpenCsharpWrapper (GOCW). Этот метод позволяет отделить интерфейс от бизнес-логики, эффективно выполнять вызовы алгоритмов и легко поддерживать алгоритмы. Можно сказать, что это результат моего многолетнего опыта работы над проектами.

Адрес публикации GOCW: https://gitee.com/jsxyhelu2020/gocw.

2. Особенности GOCW:

  1. Разделение интерфейса и бизнес-логики.
  2. Передача данных изображения через память для эффективного выполнения вызовов алгоритмов.
  3. Возможность прямого написания кода на C++ для удобства обслуживания и улучшения.
  4. Возможность использования в C# через CLR с предоставлением функций уровня интерфейса.
  5. Открытый исходный код.

3. Использование GOCW

Скачайте gocw_master, после распаковки получите два каталога файлов. GOCW — это файл библиотеки классов, а WINFORM_DEMO — пример ссылки. Откройте WINFORM_DEMO.sln (или создайте новое приложение winform) в Visual Studio 2017 или более поздней версии и добавьте ссылку на GOCW в разделе «Ссылки».

Обратите внимание:

  • Для правильной компиляции GOCW требуется правильная конфигурация OpenCV, поэтому необходимо правильно настроить include и lib и убедиться, что соответствующие файлы dll доступны корректно.
  • Убедитесь, что версии dll и программы на C# совпадают.
  • В диспетчере конфигурации все проекты должны использовать 64-битную версию.

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 )

Вы можете оставить комментарий после Вход в систему

Введение

Чтобы решить проблемы при написании программ OpenCV на C#, я провёл глубокое исследование и реализовал эффективный и удобный метод GreenOpenCsharpWrapper (GOCW). Этот метод позволяет разделить интерфейс и алгоритмическую логику, эффективно выполнять вызовы алгоритмов и упрощает их поддержку. Можно сказать, что это результат моих многолетних усил... Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/jsxyhelu2020-gocw.git
git@api.gitlife.ru:oschina-mirror/jsxyhelu2020-gocw.git
oschina-mirror
jsxyhelu2020-gocw
jsxyhelu2020-gocw
master