Перейти к содержимому
Compvision.ru
David

Аналог ф-ии bwareaopen MatLab

Recommended Posts

Помогите пожалуйста перевести из с++ в с# аналог ф-ии bwareaopen:

void bwareaopen(cv::Mat& image, double size)

{

    // считывается один unsigned char на пиксель

    if (image.channels() != 1 || image.type() != CV_8U)

        return;


    // Поиск всех контуров

    std::vector<std::vector<cv::Point> > contours;

    cv::findContours(image.clone(), contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);


    for (int i = 0; i < contours.size(); i++)

    {

        double area = cv::contourArea(contours[i]);


        // Удаление объектов, путём закрашиания контуров черным цветом

        if (area > 0 && area <= size)

            cv::drawContours(image, contours, i, CV_RGB(0,0,0), -1);

    }

}


int _tmain(int argc, _TCHAR* argv[])

{

     cv::Mat image = cv::imread("70.jpg", CV_LOAD_IMAGE_GRAYSCALE);//Загрузка изображения с градациями серого

	 cv::imshow("input", image );

	 //Вызов функции, удаление объектов меньше чем 40 pixels

bwareaopen(image, 40);

cv::imshow("output", image);

        cv::waitKey(0);

        return 0;

}

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

всё тоже самое только используя обёртку

http://robocraft.ru/blog/computervision/575.html

я пользовался этим, единственное там некоторые коменты на японском, но сам интерфейс вроде бы попроще чем у EmguCV

http://code.google.com/p/opencvsharp/

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

к примеру взять код:

cv::Mat image = cv::imread("70.jpg");//Загрузка изображения с градациями серого

         cv::imshow("input", image );
его аналогом будет:
IplImage*Image=cvLoadImage("70.jpg");

cvShowImage("input", image); 

в чем принципиальное различие?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Разница в семантике.

1) Для того что-бы другие люди могли вас правильно понимать вы должны осмысленно давать имена переменным, классам.

2) Разделяй и властвуй. Для архитектуры важно разграничивать разные блоки.

Так вот есть два различных понятия матрица и изображения.

Матрица это математическое понятие и к графике оно не имеет отношения. Но над матрицами определены операции сложения умножения, собственные вектора и тд.

Над изображением определены другие операций перевод в градации серого, оператор границ.

Правильнее использовать

IplImage*Image=cvLoadImage("70.jpg");

cvShowImage("input", image);

А если нужно сделать вычитание или сложение, то переводишь в матрицу cv::Mat mat

Это культура программирования. И она важна, когда над проектом работает много людей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Pavia00, спасибо за ответ!! а как можно делать переходы от матрицы к изображению и обратно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так как IplImage унаследован от Mat то можете смела его использовать как матрицу. Прямое и обратное преобразование будет происходить автомотически.

Чтобы явно написать можно сделать так.

//Преобразование из IplImage в CvMat, без копирования данных.

CvMat cvmat = image; // convert cv::Mat -> CvMat

Что касается обратного, то тогда если используете явное преобразование, то надо будет приляпать заголовок.

IplImage stub, *dst_img;

dst_img = cvGetImage(src_mat, &stub);

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

//Преобразование из IplImage в CvMat, без копирования данных.

CvMat cvmat = image; // convert cv::Mat -> CvMat

а как сделать с сохранением\копированием данных?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если работаете с cv:Mat, так работайте с cv::Mat, если используете IplImage* и CvMat, так и работайте с ними.

Незачем мешать интерфейсы. Будете перемешивать, получится бардак.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Smorodov, спасибо за совет! Просто проблема в том, что основной код в проекте через Iplimage* и т.д. , без использования матриц и мне получается надо преобразовать эту ф-ию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

по сути изображение это и есть матрица.

cv::Mat это новый ООПнутый интерфейс, если используете новую версию opencv то и используйте этот тип.

из плюсов, что не надо явно освобождать память, а "оно само" в деструкторе и еще всякие удобные операции над матрицами аля матлаб(хотя в opencv они не такие уж удобные)

если есть старый код, то перевод из типа в тип делается легко

http://opencv.willowgarage.com/documentation/cpp/c++_cheatsheet.html

обратите внимание с копированием и без копирования

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×