导航:首页 > 源码编译 > opencvmeanshift源码

opencvmeanshift源码

发布时间:2022-02-12 12:54:46

① opencv 用cvPryMeanShiftFiltering做图像分割,想将分块后每个区域设置个标签 生成一个label的mat 怎么做

刚好我写了类似的代码,但是我用的是 pyrMeanShiftFiltering() 这个函数,可能会稍有些不同。我把我的整个函数放在下面,你自己看下:
void meanShiftSegmentation(cv::Mat &firstImage, cv::Mat &secondImage, cv::Mat &overlapSegmentsResults)
{
int imageHeight = firstImage.rows;
int imageWidth = firstImage.cols;

cv::Mat firstResults;
cv::pyrMeanShiftFiltering(firstImage, firstResults,10,10);
cv::Mat secondResults;
cv::pyrMeanShiftFiltering(secondImage, secondResults,10,10);

cv::Mat mask(imageHeight+2, imageWidth+2, CV_8UC1, cv::Scalar(0));
uchar* maskData = mask.data;
RNG rng=theRNG();
for (int i = 0 ; i < imageHeight ; i++)
{
for (int j = 0 ; j < imageWidth ; j++)
{
if (maskData[(i+1)*imageWidth + j+1] == 0)
{
Scalar newcolor(rng(255),rng(255),rng(255));
floodFill(firstResults,mask,Point(j,i),newcolor,0,Scalar::all(1),Scalar::all(1));
}
}
}
mask.setTo(0);
for (int i = 0 ; i < imageHeight ; i++)
{
for (int j = 0 ; j < imageWidth ; j++)
{
if (maskData[(i+1)*imageWidth + j+1] == 0)
{
Scalar newcolor(rng(255),rng(255),rng(255));
floodFill(secondResults,mask,Point(j,i),newcolor,0,Scalar::all(1),Scalar::all(1));
}
}
}

imwrite("E:\\firstMeanShift.png",firstResults);
imwrite("E:\\secondMeanShift.png",secondResults);
}

② 求meanshift分割代码!

你好,这是我以前下载的一段代码,需要在matlab环境下运行。希望对你有所帮助,代码如下:(代码是作者pineapple写的,引用的时候记得说明一下。)

function [MS_reg,pUnRegion,region_index_sum,region_index_n] = meanshiftseg(A,nThreshold)
%*-------------------------------------------------------------------------
%* 作者 :pineapple 时间 :2007.5.23
%* 联系方式 :QQ (94031570) Email([email protected])
%*-------------------------------------------------------------------------
%* 函数说明:[MS_reg,pUnRegion] =meanshiftseg(A,nThreshold)
%* 输入参数:
%* A: 经meanshift平滑过后的灰度图象
%* 输出参数:
%* MS_reg: 分割后的图像,被分割成连续的区域部分的像素值是其区域内的均值
%* pUnRegion: 分割后的图像的标志图像,不同区域用不同的编号表示
%
A = double(A);
[m,n] = size(A);
MS_reg = zeros(m,n);
nDx = [-1 0 1 0];
nDy = [0 1 0 -1];
pUnRegion = zeros(m,n); % 用来标志当前像素点有没有被处理
region_index = 0; % 记录按当前规则进行分割后,得到的总的类别数
region_index_n = zeros(1,m*n); % 记录每个类别中的像素点的个数
region_index_sum = zeros(1,m*n); % 记录每个类别中的像素点的值的和

pnGrowQueX = zeros(1,m*n);
pnGrowQueY = zeros(1,m*n); % 定义堆栈

for i=1:m
for j=1:n
if(pUnRegion(i,j)==0) %如果当前点没有被处理
region_index = region_index + 1;
pUnRegion(i,j) = region_index;
% 对应该区域的点数加1
region_index_n(region_index)=region_index_n(region_index)+1;

region_index_sum(region_index)=region_index_sum(region_index) +A(i,j); % 更新该类别的和
nStart = 1;
nEnd = 1;
% 设置种子点为当前点
pnGrowQueX(nEnd) = i;
pnGrowQueY(nEnd) = j;

while nStart<=nEnd
% 当前种子点的坐标
nCurrX = pnGrowQueX(nStart);
nCurrY = pnGrowQueY(nStart);

% 对当前点的4邻域进行遍历
for k=1:4
xx = nCurrX + nDx(k);
yy = nCurrY + nDy(k);
% pUnRegion[yy*nWidth+xx]==0 表示还没有处理
% 生长条件:判断象素(xx,yy)和当前象素(nCurrX,nCurrY)
% 象素值差的绝对值
if((yy<=n)&(yy>=1)&(xx<=m)&(xx>=1)...
&(pUnRegion(xx,yy)==0)...
&abs(A(xx,yy)-A(nCurrX,nCurrY))<nThreshold)
nEnd=nEnd + 1; % 堆栈的尾部指针后移一位
% 象素(xx,yy) 压入栈
pnGrowQueX(nEnd) = xx;
pnGrowQueY(nEnd) = yy;

% 把象素(xx,yy)设置成region_index
% 同时也表明该象素处理过
pUnRegion(xx,yy) = region_index;

% 对应该区域的点数加1
region_index_n(region_index)=region_index_n(region_index)+1;
% 更新该类别的和
region_index_sum(region_index)=region_index_sum(region_index) +A(xx,yy);
end
end
nStart=nStart+1;
end %
end
end
end

for i=1:m
for j = 1 :n
temp = pUnRegion(i,j);
MS_reg(i,j) = round(region_index_sum(temp)/region_index_n(temp));
end
end
MS_reg = uint8(MS_reg);

③ 谁能跟我详细说一下meanshift算法图像分割的原理以及应用

meanShift,均值漂移,在聚类、图像平滑、分割、跟踪等方面有着广泛的应用。meanShift这个概念最早是由Fukunage在1975年提出的,其最初的含义正如其名:偏移的均值向量;但随着理论的发展,meanShift的含义已经发生了很多变化。

④ meanshift分割算法


1.识别静态的整个人体较难;即使识别出来结果也不可靠,所以现在主要以手势/人脸识别为主;这是因为手和脸上面有比较独特的特征点。你说的滤波归根结底还是要找出具有灰度跳变的高频部分作为人体;这除非背景中除了人以外没有其他突出的物体;否则光凭滤波二值法检测人体是不太现实。

2 两张图片中人要是产生相对运动,检测起来就容易多了;利用帧间差分找到图像中灰度相差大的部分(你用的滤波也是一种手段);然后二值化区域连通;要是图像中没有其他移动物体计算连通区域的变动方向就是人的运动方向。

你可以去PUDN上搜搜相关的目标检测的代码;完全和你这个对应是不可能的。照你说的情况可以先建立起静态背景的模型(或者直接在没人的时候拍张);然后不断的与这个背景做差,原理和帧间差分一样。建议你先从典型的帧间差分例程开始下手(比如移动车辆的检测,这个比较多)。

你在二值化之后加上一个区域连通的步骤;即使用膨胀或者闭运算;这样你的轮廓就是连续的了;用matlab的话bwlabel可以统计连通区域里面像素的个数也就是人体面积大小。质心就是横竖坐标的平均值;取所有人体点的横竖坐标分别累加;除以坐标总数得到的x和y平均值;这个就是质心了

⑤ opencv3 mean-shift的例子在哪

opencv\sources\samples\cpp\camshiftdemo.cpp

static void help()
{
cout << "\nThis is a demo that shows mean-shift based tracking\n"
"You select a color objects such as your face and it tracks it.\n"
"This reads from video camera (0 by default, or the camera number the user enters\n"
"Usage: \n"
" ./camshiftdemo [camera number]\n";
cout << hot_keys;
}

⑥ 求一份基于c++写的,将meanshift算法用在聚类方面的源码做个参考,能帮忙的回复下,谢谢

meanshift算法用在聚类方面的源码需要提供您的要求,我才能帮.

⑦ 谁有基于meanshift的目标跟踪程序

基于opencv的meanshift连续跟踪算法,也就是camshift,网上很多。
比如:
http://blog.csdn.net/koriya/archive/2008/11/21/3347365.aspx

⑧ 求一个基于opencv图像分割的源程序,能在VS2008平台上运行的

我有点兴趣,,,不知道你的分割效果怎么样,我可以帮你看看代码问题

⑨ 我看了好几天了,就是没有明白meanshift是怎么做图像分割的。这方面的论文有很多,但就是讲了一个核函数

对图像的分割,通常是彩色图像。一般对彩色图像分割依据是这个部分的像素的颜色信息,故通常是将彩色图像转换到HSV、LUV等图像,分割就是根据每个像素的HSV(例如)三个参数进行分类,将所有像素点建立向量(H,S,V) 然后在这个三维空间中,寻找密度驻点(MEANSHIRFT),通常驻点不止一个,故就得到了类别及中心,然后计算像素(H,S,V)到这些中心的距离最小的那个,用这个中心的类别代表这个像素的类别,然后还可以将中心的(H,S,V)代替像素的(H,S,V),这样会得到图像的分割图像,为了分割图像的明显,还可将各个类别中心的(H,S,V)设为明显差异的参数。以上为个人理解。

阅读全文

与opencvmeanshift源码相关的资料

热点内容
php模除 浏览:248
android上传图片方式 浏览:882
华为视频会议服务器如何连接 浏览:219
phpfpm并发数 浏览:923
云服务器哪里看 浏览:243
戴尔emc服务器led怎么拔出 浏览:792
程序员霸王 浏览:369
文件夹重合如何分开 浏览:161
mdk3命令 浏览:502
我的世界服务器云地址是什么 浏览:754
往复压缩机气缸 浏览:246
骰子挂云服务器 浏览:944
弹性基础钢筋加密区 浏览:747
html中插入php代码 浏览:275
js读取php返回的json 浏览:395
寻星app怎么找星星 浏览:227
磁盘要加密吗 浏览:465
夕阳风采app怎么下载不了 浏览:442
安卓方舟商店为什么不可用 浏览:642
phpecho字符串 浏览:685