将代码从MATLAB移植到C(OpenCV)

时间:2015-04-13 09:46:19

标签: c matlab opencv

我一直在努力尝试移植一个小型的平移跟踪程序,这与涉及执行反投影的平均移位有所不同,从MATLAB到C,但我遇到了一些问题。

我不知道如何解释从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 个答案:

答案 0 :(得分:1)

  

在MATLAB中,我可以直接读取,访问和更改像素值,例如   为:

     

Img(x,y)= 0将某个像素值设置为0或Img(:,:,1)= 1来设置   某些通道的像素都为0。

     

我是否可以像上面所示的那样快速地完成这些事情   OpenCV的?

当然这是可能的。设置单个像素的使用值:

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

其中img_single_element_type取决于mat类型,可能是double,unsigned char,int等...有关详细信息,请参阅文档。

要使用setTo方法设置整个图像(或图像的一部分)中的值。


我对Matlab了解不多,所以我无法帮助您移植此代码,但请查看thisthis项目。它是用Matlab(第一个链接)编写并移植到C ++(第二个链接)的类似项目(对象跟踪器 - 开放TLD(跟踪学习检测),也称为捕食者)。希望它有所帮助。