Jump to content
Compvision.ru
Sign in to follow this  
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;

}

}

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

cvShowImage("input", image); 

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

cvShowImage("input", image);

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

IplImage stub, *dst_img;

dst_img = cvGetImage(src_mat, &stub);

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×