Эффективный способ обнуления строк с помощью OpenCV

Я использую OpenCV 2.2 в Windows 7.

Я делаю маску, в которой все строки от 1 до строки 400 и 0 для строк после нее. Я инициализирую маску с помощью cv::Mat::ones() и задаюсь вопросом, какой будет наиболее эффективный способ обнулить строки за пределами 400. Я мог бы использовать циклы for, но мне было интересно, есть ли более эффективный и аккуратный способ сделать Это.

Спасибо, Питер.


person OtagoHarbour    schedule 10.01.2012    source источник


Ответы (2)


Существует более одного способа сделать это:

Во-первых, подматрицы

Mat bigImg(width, height, CV_8UC3);
bigImg(Rect(0,0,width, height/2)) = Scalar::all(1); // upper half ones
bigImg(Rect(0,height/2,width, height/2)) = Scalar::all(0); // lower half zeros

Или вы можете использовать RowRange и ColRange для того же эффекта.

bigImg(rowRange, colRange) = Scalar::all(n);

Просто проверьте документы о том, как использовать диапазоны

person Sam    schedule 10.01.2012
comment
хороший! если вы довольны этим, не стесняйтесь принимать / голосовать за ответ. - person Sam; 13.01.2012

Единственный известный мне способ — создать матрицу 400xm с cv::Mat::ones() и матрицу 400x(n-m) с cv::Mat::zeros(), а затем соединить их вместе. Однако это связано с накладными расходами на создание двух матриц, а затем изменение размера одной, чтобы она была достаточно большой, чтобы содержать другую.

Я думаю, что цикл определенно более эффективен. Во всяком случае, я предполагаю, что это C/C++, и это самый быстрый способ для этого конкретного вида операций.

person mathematical.coffee    schedule 10.01.2012
comment
Я сейчас зацикливаюсь. Спасибо. - person OtagoHarbour; 13.01.2012