我一直在努力尝试移植一个小型的平移跟踪程序,这与涉及执行反投影的平均移位有所不同,从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一样快速地完成这些事情?
答案 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了解不多,所以我无法帮助您移植此代码,但请查看this和this项目。它是用Matlab(第一个链接)编写并移植到C ++(第二个链接)的类似项目(对象跟踪器 - 开放TLD(跟踪学习检测),也称为捕食者)。希望它有所帮助。