導航:首頁 > 源碼編譯 > 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源碼相關的資料

熱點內容
js讀取php返回的json 瀏覽:391
尋星app怎麼找星星 瀏覽:222
磁碟要加密嗎 瀏覽:460
夕陽風采app怎麼下載不了 瀏覽:438
安卓方舟商店為什麼不可用 瀏覽:638
phpecho字元串 瀏覽:683
中國銀行app怎麼關聯人 瀏覽:755
eds是什麼伺服器 瀏覽:459
半圓命令鍵 瀏覽:446
linux文件系統實現 瀏覽:856
cadchange命令 瀏覽:328
電腦圖譜源碼大全 瀏覽:757
dos系統下命令 瀏覽:527
運維狗和程序員 瀏覽:709
哪個APP看紙牌屋 瀏覽:558
外賣領券app哪個最好買 瀏覽:315
linux中文字體包 瀏覽:755
git命令行建分支 瀏覽:850
致信伺服器地址和埠要怎麼找 瀏覽:985
android圖片文件壓縮 瀏覽:896