2015-04-13 3 views
0

Я работал над попыткой подключить небольшую программу отслеживания движения, которая отличается от метода, связанного с выполнением обратной проекции, от MATLAB до C, m с некоторыми проблемами с ним.Портирование кодов от MATLAB до C (OpenCV)

Я не знаю, как интерпретировать некоторые линии от MATLAB до C (OpenCV).

https://drive.google.com/drive/folders/0B2r9FmkcbNwAbHdtVEVkSW1SQW8

Я поставил 2 .m файлы, 1 .cpp файл и каталог, в котором фотографии размещаются на обе программы, чтобы использовать на моем googledrive.

«demo_MultiMeanShift_1st_ver_0413.m» является то, что я хотел бы порт C,

«boxfilter.m» это функция, которая находится в следующем веб-сайте: http://blog.csdn.net/wds555/article/details/23176313 (Это китайский сайт, однако)

и «Meanshift_demo.cpp» - это то, что я сделал до сих пор.

Там вы в основном две части, которые я не знаю, как интерпретировать из MATLAB в C: первая часть:

bas = zeros(hei,wid,N) ; 
for i = 1 : 1 : N 
    bas(:,:,i) = boxfilter(ones(hei,wid), floor(r/i)) ; 
end 


Ic_mean = zeros(hei,wid,dep,N) ; 


for i = 1 : 1 : N 
    for d = 1 : 1 : dep 
     %Average pixel value(s) of the object being tracked 
     Ic_mean(pc(2)-(r+sw) : pc(2)+(r+sw), pc(1)-(r+sw) : pc(1)+(r+sw), d, i) = boxfilter(Ip(pc(2)-(r+sw) : pc(2)+(r+sw), pc(1)-(r+sw) : pc(1)+(r+sw),d), floor(r/i)) ./ bas(pc(2)-(r+sw) : pc(2)+(r+sw), pc(1)-(r+sw) : pc(1)+(r+sw),i); 
     %Ic_mean(:,:,d,i) = boxfilter(Ip(:,:,d), floor(r/i)) ./ bas(:,:,i);   
    end 
end 

dis = zeros(1,N) ; 

вторая часть:

for i = -sw + pc(2) : 2 : sw + pc(2) 
    for j = -sw + pc(1) : 2 : sw + pc(1) 
     for d = 1 : 1 : N 
      dis(d) = sqrt(... % (p1(R1, G1, B1) - p2(R2, G2, B2))^2 
        (Ic_mean(i,j,1,d) - Ip_mean(pc(2),pc(1),1,d))^2 ... 
       + (Ic_mean(i,j,2,d) - Ip_mean(pc(2),pc(1),2,d))^2 ... 
       + (Ic_mean(i,j,3,d) - Ip_mean(pc(2),pc(1),3,d))^2); 
     end 
     if disMin > mean(dis) 
      disMin = mean(dis) ; 
      i_hold = i ; 
      j_hold = j ; 
     end 
    end 
end 

В MATLAB я могу читать , получать доступ и изменять значения пикселей непосредственно, например:

Img (x, y) = 0, чтобы установить значение некоторого пикселя 0 или Img (:,:, 1) = 1, чтобы установить, что пиксели определенного канала для всех равны 0.

Могу ли я также делать такие вещи так же быстро, как показано выше в OpenCV?

ответ

1

В MATLAB я могу читать, просматривать и изменять значения пикселей непосредственно, например как:

Img (х, у) = 0, чтобы установить какое-то значение пиксела, которое должно быть 0 или Img (:,:, 1) = 1 для установки пикселей для каждого канала для всех будет 0.

Могу ли я так же быстро, как показано выше, в OpenCV?

Конечно, это возможно. Для того, чтобы установить значение одноразового использования пикселей:

img.at<img_single_element_type>(y,x) = 0; 

где img_single_element_type зависит от типа циновки и может быть двойным, неподписанный символ, INT, и т.д ... Обратитесь к документации для получения дополнительной информации.

Для установки значений всего изображения (или части изображения) используйте метод setTo.


Я не знаю много о Matlab, поэтому я не могу вам помочь с портированием этот код, но смотреть на this и this проекта. Это аналогичный проект (object tracker - Open TLD (Tracking Learning Detection) aka Predator), написанный в Matlab (первая ссылка) и перенесенный на C++ (вторая ссылка). Надеюсь, поможет.

+0

Ну, в настоящее время я использовал C-стилевые функции в OpenCV вместо C++. Это может занять некоторое время, чтобы привыкнуть к нему. –

+0

Мне все еще нужно выяснить, как получить доступ к пикселям в OpenCV. Это вызвало у меня проблемы в течение некоторого времени. Ты за свою помощь. –

Смежные вопросы