wiseman s Ответов: 2

Как я могу преобразовать этот код Python в C++?


Я ничего не знаю о Пайтоне. Но я хочу, чтобы реализовать "согласованность-повышение Йоахим Weickert шок фильтров" для C++ и OpenCV. Только исходный код, который я нашел написанным в pyhton.

функции opencv в порядке . Я могу адаптировать, но некоторые переменные структуры, которые использует pyhton, я не могу преобразовать их.

Исходный код https://github.com/opencv/opencv/blob/3.2.0/samples/python/coherence.py- а мне нужна только эта часть.

<pre lang="Python"><pre>def coherence_filter(img, sigma = 11, str_sigma = 11, blend = 0.5, iter_n = 4):
h, w = img.shape[:2]

for i in xrange(iter_n):
    print(i)

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    eigen = cv2.cornerEigenValsAndVecs(gray, str_sigma, 3)
    eigen = eigen.reshape(h, w, 3, 2)  # [[e1, e2], v1, v2]
    x, y = eigen[:,:,1,0], eigen[:,:,1,1]

    gxx = cv2.Sobel(gray, cv2.CV_32F, 2, 0, ksize=sigma)
    gxy = cv2.Sobel(gray, cv2.CV_32F, 1, 1, ksize=sigma)
    gyy = cv2.Sobel(gray, cv2.CV_32F, 0, 2, ksize=sigma)
    gvv = x*x*gxx + 2*x*y*gxy + y*y*gyy
    m = gvv < 0

    ero = cv2.erode(img, None)
    dil = cv2.dilate(img, None)
    img1 = ero
    img1[m] = dil[m]
    img = np.uint8(img*(1.0 - blend) + img1*blend)
print('done')
return img


Особенно я не понимаю этой части :
<pre lang="Python">eigen = eigen.reshape(h, w, 3, 2)  # [[e1, e2], v1, v2]
x, y = eigen[:,:,1,0], eigen[:,:,1,1]


и
m = gvv < 0 and after this it uses m for img1 array. img1[m] = dil[m]


Кто-нибудь может помочь в этом?

Что я уже пробовал:

Я могу конвертировать функции opencv, но я застрял на массивах.

Richard MacCutchan

Вы не можете преобразовать его в C++, так как нет прямого эквивалентного кода. Сначала вам нужно понять, что пытается сделать программа, а затем вы можете исследовать, как сделать то же самое в C++.

2 Ответов

Рейтинг:
1

Tachyonx

Для начала я предлагаю найти эквиваленты C++ для библиотек Python, которые вы не упоминаете в своем примере ... как этот эквивалент Numpy

GitHub - dpilger26/NumCpp: реализация библиотеки Python Numpy на языке C++ [^]

Исследование должно быть сделано для всех строк вашего кода Python, как уже упоминалось в других сообщениях здесь ...

и... похоже, что здесь существует реализация C++
utils/coherence_filter.hpp · fdde4b7614968cb465b642955789a171b63d3b53 · Франциска Калерт / учебная Диссертация · GitLab[^]
Возможно, это поможет
Овации


Рейтинг:
0

OriginalGriff

Это не служба преобразования кода: мы здесь не для того, чтобы переводить код для вас.
Даже если бы мы это сделали, то в конечном итоге вы получили бы не “хороший код” на целевом языке – они основаны на очень разных фреймворках, и то, что заставляет что-то работать на одном языке, не всегда “переводится” непосредственно на другой.
Таким образом, вы получаете очень плохой код, который трудно, если не невозможно поддерживать, который не может быть хорошо обновлен, и это вызовет у вас огромную головную боль, если оригинал будет изменен. И это будет кошмар для отладки, если он не будет работать “прямо из коробки”.
Вместо этого используйте исходный код в качестве спецификации для нового приложения, написанного на целевом языке / фреймворке, и напишите его w=с нуля, используя оригинал в качестве “шаблона”. Вы получите гораздо, гораздо лучший результат, который сэкономит вам много времени в долгосрочной перспективе.


wiseman s

Спасибо за ваш комментарий. Но все что я хочу это понять эту часть;
х, г = Эйген[:,:,1,0], Эйген[:,:,1,1]
а m = gvv < 0 означает. Я не прошу полного преобразования кода :)

Dave Kreskowiak

Ну, вы получили ответ, который вы сделали, потому что почти всегда люди, спрашивающие: "как мне преобразовать этот код...", - это студенты, которые пытаются быстро выполнить задание, не выполняя никакой реальной работы по вычислению алгоритма и написанию некоторого кода.

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