David 0 Жалоба Опубликовано May 23, 2013 Помогите пожалуйста перевести из с++ в с# аналог ф-ии 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; } } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 24, 2013 всё тоже самое только используя обёртку http://robocraft.ru/blog/computervision/575.html я пользовался этим, единственное там некоторые коменты на японском, но сам интерфейс вроде бы попроще чем у EmguCV http://code.google.com/p/opencvsharp/ Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
David 0 Жалоба Опубликовано May 25, 2013 к примеру взять код: cv::Mat image = cv::imread("70.jpg");//Загрузка изображения с градациями серого cv::imshow("input", image ); его аналогом будет: IplImage*Image=cvLoadImage("70.jpg"); cvShowImage("input", image); в чем принципиальное различие? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Pavia00 32 Жалоба Опубликовано May 25, 2013 Разница в семантике. 1) Для того что-бы другие люди могли вас правильно понимать вы должны осмысленно давать имена переменным, классам. 2) Разделяй и властвуй. Для архитектуры важно разграничивать разные блоки. Так вот есть два различных понятия матрица и изображения. Матрица это математическое понятие и к графике оно не имеет отношения. Но над матрицами определены операции сложения умножения, собственные вектора и тд. Над изображением определены другие операций перевод в градации серого, оператор границ. Правильнее использовать IplImage*Image=cvLoadImage("70.jpg"); cvShowImage("input", image); А если нужно сделать вычитание или сложение, то переводишь в матрицу cv::Mat mat Это культура программирования. И она важна, когда над проектом работает много людей. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
David 0 Жалоба Опубликовано May 25, 2013 Pavia00, спасибо за ответ!! а как можно делать переходы от матрицы к изображению и обратно? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Pavia00 32 Жалоба Опубликовано May 25, 2013 Так как IplImage унаследован от Mat то можете смела его использовать как матрицу. Прямое и обратное преобразование будет происходить автомотически. Чтобы явно написать можно сделать так. //Преобразование из IplImage в CvMat, без копирования данных. CvMat cvmat = image; // convert cv::Mat -> CvMat Что касается обратного, то тогда если используете явное преобразование, то надо будет приляпать заголовок. IplImage stub, *dst_img; dst_img = cvGetImage(src_mat, &stub); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
David 0 Жалоба Опубликовано May 25, 2013 //Преобразование из IplImage в CvMat, без копирования данных. CvMat cvmat = image; // convert cv::Mat -> CvMat а как сделать с сохранением\копированием данных? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 25, 2013 Если работаете с cv:Mat, так работайте с cv::Mat, если используете IplImage* и CvMat, так и работайте с ними. Незачем мешать интерфейсы. Будете перемешивать, получится бардак. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
David 0 Жалоба Опубликовано May 25, 2013 Smorodov, спасибо за совет! Просто проблема в том, что основной код в проекте через Iplimage* и т.д. , без использования матриц и мне получается надо преобразовать эту ф-ию. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 26, 2013 по сути изображение это и есть матрица. cv::Mat это новый ООПнутый интерфейс, если используете новую версию opencv то и используйте этот тип. из плюсов, что не надо явно освобождать память, а "оно само" в деструкторе и еще всякие удобные операции над матрицами аля матлаб(хотя в opencv они не такие уж удобные) если есть старый код, то перевод из типа в тип делается легко http://opencv.willowgarage.com/documentation/cpp/c++_cheatsheet.html обратите внимание с копированием и без копирования Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах