# Переведите массив numpy в эквивалент OpenCV

I am having a problem to translate numpy's ndarray functions to their equivalent OpenCV C++ calls to reshape/split a n-dimensional cv::Mat into appropriate slices. In particular i am trying to convert the OpenCV python2 sample "texture_flow.py" (>= OpenCV 2.4.3) to C++. I've marked the lines in question in the snippet below.

``````# [......]
img = cv2.imread(fn)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# simple width and height tuple
h, w = img.shape[:2]

eigen = cv2.cornerEigenValsAndVecs(gray, 15, 3)
print eigen.shape # prints: (height, widht, 6), i.e. 6 channels

# Problem 1:
# OpenCV's reshape function is not sufficient to do this.
# probably must be split into several steps...
eigen = eigen.reshape(h, w, 3, 2)  # [[e1, e2], v1, v2]
print eigen.shape # prints: (height, width, 3, 2)

# Problem 2:
# I assume this is meant to get the the v1 and v2 matrices
# from the previous reshape
flow = eigen[:,:,2]
print flow.shape # prints: (height, width, 2), i.e. 2 channels

vis = img.copy()
# C++: vis.data[i] = (uchar)((192 + (int)vis.data[i])/2);
vis[:] = (192 + np.uint32(vis))/2

d = 12

# Problem 3:
# Can probably be split into 2 nested for-loops
points =  np.dstack( np.mgrid[d/2:w:d, d/2:h:d] ).reshape(-1, 2)

# [......]
``````

Может ли кто-нибудь помочь мне перевести соответствующие строки на C ++?

5

## 1 ответы

После тщательного размышления об этом все было легче, чем ожидалось. Это только смешной синтаксис массива nump, который меня сбивает с толку. Реорганизация массивов numpy - это просто способ python для доступа к одиночным каналам результирующего cv :: Mat "anigen". Следующий код - это версия C ++ «texture_flow.py» на C ++ (взята из OpenCV 2.4.3). Результирующее изображение потока не на 100% идентично версии python, но оно достаточно близко.

``````#include
#include

int main (int argc, char** argv)
{
cv::TickMeter tm;
tm.start();
cv::Mat img = cv::imread(argv);
cv::Mat gray = cv::Mat();
cv::cvtColor(img, gray, CV_BGR2GRAY);
//to preserve the original image
cv::Mat flow = gray.clone();
int width = img.cols;
int height = img.rows;
int graySize = width * height;
//"brighten" the flow image
//C++ version of:
//vis[:] = (192 + np.uint32(vis))/2
for (unsigned int i=0; i channels;
cv::split(eigen, channels);

int d = 12;
cv::Scalar col(0, 0, 0);
//C++ version of:
//points =  np.dstack( np.mgrid[d/2:w:d, d/2:h:d] ).reshape(-1, 2)
//including the actual line drawing part
for (unsigned int y=(d/2); y< flow.cols && y < flow.rows)
{
cv::Point p(x, y);
float dx = channels.at(p) * (d/2);
float dy = channels.at(p) * (d/2);
cv::Point p0(p.x - dx, p.y - dy);
cv::Point p1(p.x + dx, p.y + dy);
cv::line(flow, p0, p1, col, 1);
}
}
}
tm.stop();
std::cout<<"Flow image generated in "<<<" ms."<``````
2
добавлено Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926 Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7 pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155 supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую! C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram. cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest