Встраивание кода C++

На вашем изображении есть 5 контуров: 2 внешних контура, 2 внутренних контура и 1 в верхнем правом углу.

Вы можете отбросить внутренние и внешние контуры, если они ориентированы на CW или CCW. Вы можете сделать это с помощью contourArea с ориентированным флагом:

ориентированный - флаг ориентированной области. Если это правда, функция возвращает значение подписанной области, в зависимости от ориентации контура (по часовой стрелке или против часовой стрелки). Используя эту функцию, вы можете определить ориентацию контура, взяв знак области. По умолчанию параметр равен false, что означает, что возвращается абсолютное значение.

blockquote>

Итак, вычерчивая внешние контуры в red и внутренние в зеленые , вы получите:

Затем вы можете сохранить только внешние контуры (см. externalContours) в следующем коде:

#include 
#include 

using namespace std;
using namespace cv;

int main()
{
    // Load grayscale image
    Mat1b B = imread("path_to_image", IMREAD_GRAYSCALE);

    // Find contours
    vector> contours;
    findContours(B.clone(), contours, RETR_TREE, CHAIN_APPROX_NONE);

    // Create output image
    Mat3b out;
    cvtColor(B, out, COLOR_GRAY2BGR);

    vector> externalContours;
    for (size_t i=0; i= 0) 
        {
            // Internal contours
            drawContours(out, contours, i, Scalar(0, 255, 0));
        }
        else
        {
            // External contours
            drawContours(out, contours, i, Scalar(0, 0, 255));

            // Save external contours
            externalContours.push_back(contours[i]);
        }
    }

    imshow("Out", out);
    waitKey();

    return 0;
}

Пожалуйста, помните, что findContours искажает входное изображение (второе изображение, которое вы показываете, - мусор ). Просто передайте клон изображения в findContours, чтобы избежать повреждения исходного изображения.

9
задан jonrsharpe 19 February 2015 в 21:51
поделиться

9 ответов

Обе формы должны быть встроены тем же самым способом. Встроенный неявно для тел функции, определенных в определении класса.

16
ответ дан 4 December 2019 в 05:58
поделиться

Гуру Sutter Недели № 33 отвечает на некоторые Ваши вопросы и т.д.

http://www.gotw.ca/gotw/033.htm

6
ответ дан 4 December 2019 в 05:58
поделиться

inline ключевое слово является по существу подсказкой к компилятору. Используя inline не гарантирует, что Ваша функция будет встроена, ни делает исключение, это гарантирует, что не будет. Вы просто позволяете компилятору знать, что это могла бы быть хорошая идея попытаться тяжелее встроить ту конкретную функцию.

26
ответ дан 4 December 2019 в 05:58
поделиться

Встроенный подсказка компилятора и не вынуждает компилятор встроить код (по крайней мере, в C++). Таким образом, короткий ответ, это - компилятор и вероятно контекстно-зависимый, что произойдет в Вашем примере. Самые хорошие компиляторы, вероятно, встроили бы обоих особенно из-за очевидной оптимизации постоянного возврата из обеих функций.

В целом встроенный не что-то, о чем необходимо волноваться. Это приносит выигрыш в производительности не необходимости выполнить машинные команды, чтобы генерировать стековый фрейм и возвратить поток управления. Но во всех кроме самых специализированных случаев я утверждал бы, что это тривиально.

Встроенный важно в двух случаях. Тот, если Вы находитесь в среде реального времени и не ответе достаточно быстро. Два то, если бы профилирование кода показало значительное узкое место в действительно жестком цикле (т.е. вызванная подпрограмма и), то затем встраивание могло помочь.

Определенные приложения и архитектура могут также привести Вас к встраиванию как оптимизация.

2
ответ дан 4 December 2019 в 05:58
поделиться
class Foo  
{
  inline int SomeFunc() { return 42; }
  int AnotherFunc() { return 42; }
};

Это корректно, что оба пути, как гарантируют, скомпилируют то же. Однако желательно не делать ни одного из этих путей. Согласно FAQ C++ необходимо обычно объявлять это в определении класса и затем определять его вне определения класса, в заголовке, с явным встроенным ключевым словом. Как FAQ описывает, это вызвано тем, что Вы хотите разделить объявление, и определение для удобочитаемости других (объявление эквивалентно "какой" и определение "как").

Действительно встраивает на самом деле имеют какое-либо значение?

Да, если компилятор предоставляет встроенный запрос, это весьма отличается. Думайте о встроенном коде как о макросе. Везде это называют, вызов функции заменяется фактическим кодом в функциональном определении. Это может привести к чрезмерному увеличению размера кода, если Вы встраиваете большие функции, но компилятор обычно защищает Вас от этого, не предоставляя встроенный запрос, если функция является слишком большой.

Есть ли какие-либо правила о том, когда Вы должны, или не был должен встроенный код?

Я не знаю ни о каких правилах hard+fast, но инструкция только к встроенному коду, если это часто называют, и это является относительно маленьким. Методы set и методы считывания обычно встраиваются. Если это находится в особенно производительность интенсивная область кода, встраивание нужно рассмотреть. Всегда помните торговлю скоростью выполнения на исполняемый размер со встраиванием.

3
ответ дан 4 December 2019 в 05:58
поделиться

VC ++ поддерживает __ forceinline и __ declspec (noinline) директивы, если Вы думаете, что знаете лучше, чем компилятор. Подсказка: Вы, вероятно, не делаете!

2
ответ дан 4 December 2019 в 05:58
поделиться

Обратите внимание на это за пределами класса, inline делает что-то более полезное в коде: вынуждая (хорошо, вид) компилятор C++ сгенерировать код встраивает в каждом вызове к функции, это предотвращает повторные определения того же символа (функциональная подпись) в различных единицах перевода.

Таким образом, если Вы встраиваете не являющуюся членом функцию в заголовочном файле и включаете это в несколько cpp файлов, у Вас нет компоновщика, вопящего на Вас. Если функция является слишком большой, чтобы Вы предложили встроенный луг, сделайте это путь C: объявите в заголовке, определите в cpp.

Это имеет мало общего, встраивается ли код действительно: это позволяет стиль реализации в заголовке, как характерно для коротких функций членства.

(Я предполагаю, что компилятор будет умен, если ему будет нужен невстроенный рендеринг функции, как это для шаблонных функций, но...),

0
ответ дан 4 December 2019 в 05:58
поделиться

Я нашел, что некоторые компиляторы C++ (Т.е. SunStudio) жалуются, опущено ли встроенное как в

int AnotherFunc() { return 42; }

Таким образом, я всегда рекомендовал бы использовать встроенное ключевое слово в этом случае. И не забывайте удалять встроенное ключевое слово при позже реализации метода как фактического вызова функции это действительно испортит соединение (в SunStudio 11 и 12 и Разработчик Borland C++). Я предложил бы делать минимальное использование встроенного кода, потому что при продвижении через код с с отладчиком, это 'ступит в' встроенный код, даже когда использование 'переступает' через команду, это может быть довольно раздражающим.

1
ответ дан 4 December 2019 в 05:58
поделиться

Также для добавления к тому, что Greg сказал при формовке оптимизации (т.е. inline- луг) компилятор консультируется не только с ключевыми словами в коде, но также и других параметрах командной строки указывание, как компилятор должен оптимизировать код.

0
ответ дан 4 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: