Как мне разыменовать в python?(Обработка изображений с openCV) - PullRequest
1 голос
/ 02 марта 2012

Я искал во всем Интернете простой алгоритм прореживания и наткнулся на это: Алгоритм прореживания Проблема в том, что у меня нет слишком большого опыта работы с оператором разыменования. Кроме того, мой проект на Python, который по-другому справляется с этой ситуацией. Итак, у меня есть несколько вопросов

1: Что делает этот бит кода?

void myThinningInit (CvMat ** kpw, CvMat ** kpb)
  {
    / / Kernel for cvFilter2D
    / / The algorithm kpw kernel binary image and it has become a matching white, black,
    / / Convolution is divided into two sets of binary image was inverted kpb kernel, then take the AND
    for (int i = 0; i <8; i + +) {
      * (Kpw + i) = cvCreateMat (3, 3, CV_8UC1);
      * (Kpb + i) = cvCreateMat (3, 3, CV_8UC1);
      cvSet (* (kpw + i), cvRealScalar (0), NULL);
      cvSet (* (kpb + i), cvRealScalar (0), NULL);
    }.....

И 2: Как я могу перевести создание этих ядер в python?

Он заканчивает тем, что делал 8 ядер, но я понятия не имею, как выглядит их матричная форма. Я не понимаю, что "* (kpw + i)" или "* (kpb + i)" делает в общей схеме программы.

3) Могу ли я просто собрать ядра и сохранить их в списке? Если да, то как я могу это сделать?

UPDATE:

k = [1, 2, 3, 5, 6, 7, 8]
kpw = []
kpb = []

for i in k:
    kpw.append [i] = cv.CreateMat (3, 3, cv.CV_8UC1)
    kpb.append [i] = cv.CreateMat (3, 3, cv.CV_8UC1)
    cv.cvSet (kpw [i], cv.RealScalar (0), cv.NULL)
    cv.cvSet (kpb [i], cv.RealScalar (0), cv.NULL)

Сначала у меня не было просто kpw [i], и это выдало мне ошибку. После быстрого поиска в Google я обнаружил, что вам нужно сначала проиндексировать массив и сделать это путем добавления. Я попробовал этот фрагмент кода, чтобы получить 8 базовых ядер размером 3х3, но я получил эту ошибку:

Traceback (последний последний вызов):

Файл "/home/krtzer/Documents/python_scripts/thinning.py", строка 14, в kpw.append [i] = cv.CreateMat (3, 3, cv.CV_8UC1) Ошибка типа: объект builtin_function_or_method не поддерживает назначение элемента

Означает ли это, что я не могу иметь матрицы в списках?

Ответы [ 3 ]

1 голос
/ 02 марта 2012

Это разыскивание - это просто создание матрицы без инициализации ее данных.Данные вручную устанавливаются в ноль с помощью таких строк, как cvSet (* (kpw + i), cvRealScalar (0), NULL).

. В python вы можете просто сделать то же самое в одном ударе с numpy.zeros, а затем использовать cv.fromarray.Или используйте x = cv.CreateMat(3, 3, cv.CV_8UC1), а затем cv.set(x, 0.).

0 голосов
/ 06 марта 2012

Я сделал новый в Python. Разбавление (Python)

0 голосов
/ 02 марта 2012

Edit - допустил (довольно большую) ошибку в этом ответе, объяснит

Похоже на массив CvMat s в kpw и kpb.

ПредположимЯ сделал список массивов kpw = [] в Python.

*(kpw + i) = ... все равно что сказать kpw[i] = ....

Похоже, что другой код инициализирует список ядер для матриц 3x30, так что вы можете сделать:

# make a list of 8  3x3 matrices of 0.
kpw = []
for i in xrange(8):
    kpw.append(np.zeros((3,3)))
    kpb.append(np.zeros((3,3)))

Примечание : у меня ранее было:

kpw = [np.zeros((3,3))] * 8
kpb = [np.zeros((3,3))] * 8

, что неправильно !Он выдает 8 ссылок на той же матрицы в пределах kpw, и поэтому изменение kpw[0] будет также изменять все остальные kpw[i]!


Тогда cvSet2D(*(kpb+0), 0, 0, cvRealScalar(0)); можно перевести на:

kpb[0][0,0] = 0

Поскольку *(kpb+0) захватывает матрицу в kpg[0], 0,0 означает элемент 0,0 изматрица, а 0 - это значение.

Итак: каждый раз, когда вы видите *(kpb+i), просто подставьте kpb[i], и вы должны найти перевод этого кода.

...