日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()

發布時間:2024/7/23 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels() 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OpenCV學習(二十二) :反向投影:calcHist(),minMaxLoc(),compareHist()

參考博客:
反向投影backproject的直觀理解
opencv 反向投影
顏色直方圖的計算、顯示、處理、對比及反向投影

一、概述

1、官方解釋:反向投影是一種記錄給定圖像中的像素點如何適應直方圖模型像素分布的方式。簡單的講,
1)就是首先計算某一特征的直方圖模型;(特征可以為色調+飽和度、灰度值等等)
2)然后使用模型去尋找圖像中存在的該特征。例如,你有一個膚色直方圖(Hue-Saturation直方圖),你可以用它(色調和飽和度)來尋找圖像中的膚色區域:

2、反向投影圖就是圖像對應位置像素的數量統計,也可以看做是密度統計。 反向投影圖在某一位置(點)的值是原圖對應位置(點)的像素值所在原圖區間(bins)的總數目。(所以,一個區間點越多,在反向投影矩陣中就越亮。)

3、反向投影中的“反向”指的是從直方圖值到反向投影矩陣映射的過程。

4、通過反向投影,原始的圖像被簡化了,而這個簡化的過程實際上就是提取出圖像的某個特征。所以我們就可以用這個特征來對比兩幅圖,如果兩幅圖的反向投影矩陣相似或相同,那么我們就可以判定這兩幅圖這個特征是相同的。

5、反向投影的作用:
反向投影用于在輸入圖像(通常較大)中查找**特定圖像(通常較小或者僅1個像素,以下將其稱為模板圖像)**最匹配的點或者區域,也就是定位模板圖像出現在輸入圖像的位置。如圖:

第一個圖為源圖像,中間的那個小圖像是產生用于反向投影的直方圖的圖像,最后的用直方圖均衡化后的結果圖像,可以看到,蘋果的像素位置幾被找到了。

二、calcBackProject()函數

calcBackProject 的基本過程是:
1)拿到 特征圖像 (或模板圖像)
2)得到 特征圖像的直方圖
3)拿到測試圖像,依據測試圖像的每個像素的值,在特征圖像的直方圖中找到對應的值,然后將直方圖的值賦給新的圖像,backproject算法就完成了。

void cv::calcBackProject( const Mat* images // 輸入圖像,圖像深度必須位CV_8U,CV_16U或CV_32F中的一種,尺寸相同,每一幅圖像都可以有任意的通道數 int nimages // 輸入圖像的數量 const int* channels // 用于計算反向投影的通道列表,通道數必須與直方圖維度相匹配,第一個數組的通道是從0到image[0].channels()-1, InputArray hist // 輸入的直方圖,直方圖的bin可以是密集(dense)或稀疏(sparse) OutputArray backProject // 目標反向投影輸出圖像,是一個單通道圖像,與原圖像有相同的尺寸和深度 const float ranges** // 直方圖中每個維度bin的取值范圍 double scale=1: // 可選輸出反向投影的比例因子 bool uniform=true: // 直方圖是否均勻分布(uniform)的標識符,有默認值true )

三、CalcBackProjectPatch()函數

對于calcBackProjectPatch,整個是基于塊的形式,利用直方圖做匹配,類似于模板匹配,只不過這些模板轉換為直方圖,而原圖中以某點為基準,摳出來作對比的部分也轉換為直方圖,兩個直方圖作匹配,匹配的結果作為此點的值。

結果會是一張概率圖,概率越大的地方,代表此區域與模板的相似度越高。而且,當模板小于檢測的目標時,得到的結果圖也能反映出檢測區域的形狀。這個結果與模板匹配的結果很相似,但利用直方圖的方式,就能去除光照變化、邊緣遮擋,旋轉等因素的影響。另外
基于塊的反向投影。這種方法速度很慢,模版圖像別弄的太大了。
例如:
1)當模板圖像小與目標的時候,作為區域檢測器,測試如下:可以找到手區域

2)當模板等于目標的時候,測試如下:輸出圖像,較亮的部分就是人的頭部大致位置

詳情參考:
opencv 直方圖反向投影

函數原型:

void cvCalcBackProjectPatch( IplImage** image, // 輸入圖像:是一個單通道圖像數組,而非實際圖像 CvArr* dst, // 輸出結果:是一個單通道32位浮點圖像,它的寬度為W-w+1,高度為H-h+1,這里的W和H是輸入圖像的寬度和高度,w和h是模板圖像的寬度和高度 CvSize patch_size, // 模板圖像的大小:寬度和高度 CvHistogram* hist, // 模板圖像的直方圖:直方圖的維數和輸入圖像的個數相同,并且次序要一致;例如:輸入圖像包含色調和飽和度,那么直方圖的第0維是色調,第1維是飽和度 int method, // 對比方式:跟直方圖對比中的方式類似,可以是:CORREL(相關)、CHISQR(卡方)、INTERSECT(相交)、BHATTACHARYYA float factor // 歸一化因子,一般都設置成1,否則很可能會出錯;中文、英文以及各路轉載的文檔都錯了,這個參數的實際類型是double,而非float,我看了源代碼才搞定這個地方 )

四、mixChannels()函數

mixChannels()函數用于將輸入數組的指定通道復制到輸出數組的指定通道。
其實我們接觸到的,split()和merge(),以及cvtColor的某些形式,都只是mixChannels()的一部分。
參考:
opencv3/C++ mixChannels()詳解:4通道圖像分割、HSV通道獲取

void mixChannels( const Mat* src, //輸入數組或向量矩陣,所有矩陣的大小和深度必須相同。 size_t nsrcs, //第一個參數src矩陣的數量 Mat* dst, //輸出數組或矩陣向量,大小和深度必須與src[0]相同 size_t ndsts, //第三個參數ndsts矩陣的數量 const int* fromTo, //指定被復制通道與要復制到的位置組成的索引對 size_t npairs //fromTo中索引對的數目 );

示例:

#include<opencv2/opencv.hpp> using namespace cv;int main() {Mat bgra( 500, 500, CV_8UC4, Scalar(255,255,0,255) );Mat bgr( bgra.rows, bgra.cols, CV_8UC3 );Mat alpha( bgra.rows, bgra.cols, CV_8UC1 );Mat out[] = { rgb, alpha };int from_to[] = { 0, 2, 1, 1, 2, 0, 3, 3 };// 輸入1一個矩陣,輸出2個舉證,4個索引對mixChannels( &bgra, 1, out, 2, from_to, 4 );imshow("bgra", bgra); // 青色imshow("bgr", bgr); // 黃色(通道值改變,色彩空間不變)waitKey(0);return 0; }

五、示例:

使用模型直方圖(代表手掌的皮膚色調)來檢測測試圖像中 的皮膚區域。
1)對測試圖像中的每個像素(p(i,j),獲取色調數據并找到該色調(h(i,j),s(i,j))在直方圖中的bin的位置;
2)查詢模型直方圖中對應的bin-(hi,j,si,j)并讀取該bin的數值;
3)將此數值存儲在新的圖像中(BackProjection)。你也可以先歸一化模型直方圖,這樣測試圖像的輸出就可以在屏幕顯示了;
4)通過對測試圖像中的每個像素采用以上步驟,我們得到了下面的BackProjection結果圖:
5)使用統計學的語言,BackProjection中存儲的數值代表了測試圖像中該像素屬于皮膚區域的概率。比如上圖為例,亮起的區域是皮膚區域的概率更大,而更暗的區域則表示更低的概率(注意手掌內部和邊緣的陰影影響了檢測的精度)。

#include <opencv2/opencv.hpp>using namespace cv; using namespace std;Mat g_srcImage,g_hsvImage,g_hueImage; int g_bins = 30;//直方圖組距int main() {// 1、載入源圖,轉化為HSV顏色模型g_srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/shou.jpg", 1);if(!g_srcImage.data ) { printf("讀取圖片錯誤,請確定目錄下是否有imread函數指定圖片存在~! \n"); return false; }cvtColor( g_srcImage, g_hsvImage, CV_BGR2HSV ); // 轉換顏色空間// 2、分離 Hue 色調通道g_hueImage.create( g_hsvImage.size(), g_hsvImage.depth() ); // 創建同尺寸、深度的單通道圖int ch[ ] = { 0, 0 };mixChannels( &g_hsvImage, 1, &g_hueImage, 1, ch, 1 );imshow("g_hueImage", g_hueImage);// 3、創建 Trackbar 來輸入bin的數目namedWindow( "反向投影圖" , CV_WINDOW_AUTOSIZE );createTrackbar("色調組距 ", "反向投影圖" , &g_bins, 180, on_BinChange );on_BinChange(0, 0);//進行一次初始化// 4、顯示效果圖imshow( "【原始圖】" , g_srcImage );waitKey(0);return 0; }

直方圖計算 bins(特征空間子區段的數目)回調函數:

void on_BinChange(int, void* ) {// 1、參數準備MatND hist;int histSize = MAX( g_bins, 2 ); // 組距 最小為2float hue_range[] = { 0, 180 };const float* ranges = { hue_range };// 2、計算直方圖并歸一化// 將handhue取值替換為g_hueImage圖像的中心部分,作為特征圖像Mat handhue_feature= g_hueImage(Rect(g_hueImage.rows/2-25, g_hueImage.cols/2-25, 50, 50)).clone();// g_hueImageimshow("handhue_feature", handhue_feature); // 顯示特征// 將handhue_feature的取值 替換為g_hueImage圖像的中心部分,作為特征圖像calcHist( &handhue_feature, 1, 0, Mat(), hist, 1, &histSize, &ranges, true, false );normalize( hist, hist, 0, 255, NORM_MINMAX, -1, Mat() ); // 歸一化直方圖數值范圍為0~255之間// 3、計算 獲取反向投影MatND backproj;calcBackProject( &g_hueImage, 1, 0, hist, backproj, &ranges, 1, true );// 4、顯示反向投影imshow( "反向投影圖", backproj );// 5、繪制直方圖的參數準備int w = 400; int h = 400;int bin_w = cvRound( (double) w / histSize );Mat histImg = Mat::zeros( w, h, CV_8UC3 );// 6、繪制直方圖for( int i = 0; i < g_bins; i ++ ){ rectangle( histImg, Point( i*bin_w, h ), Point( (i+1)*bin_w, h - cvRound( hist.at<float>(i)*h/255.0 ) ), Scalar( 100, 123, 255 ), -1 ); }// 7、顯示直方圖窗口imshow( "直方圖", histImg ); }

源圖+色調圖

特征圖:




總結

以上是生活随笔為你收集整理的OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本欧美在线 | 九九热国产视频 | 日本成人免费在线 | 日本三级黄在线观看 | 一区二区在线免费观看 | 国语对白做受xxxxx在线中国 | 午夜a级片 | 中文字幕 视频一区 | 亚洲一区在线看 | 欧美国产日本 | 五月婷婷丁香花 | 亚洲美女屁股眼交3 | 蜜臀av一区二区三区激情综合 | 美女aaa | 国产肉丝在线 | 成年精品 | 国产一级一区 | 欧美亚洲天堂 | 69色| av片免费观看 | 久久久久久中文字幕 | 91久久久久久久久久久久久 | 蜜臀av在线免费观看 | 欧美在线免费视频 | 欧美日韩国产在线播放 | 草草影院最新网址 | 美女污污网站 | 久热这里只有精品在线 | 亚洲+小说+欧美+激情+另类 | 国产成人自拍偷拍 | 火影黄动漫免费网站 | 日本黄色大片免费看 | a级一a一级在线观看 | 久久久精品久久久 | 女性向片在线观看 | 在线麻豆 | 欧美色图影院 | 欧美成人黄色小说 | 欧美91av| 最新国产网站 | 精品国产综合区久久久久久 | 亚洲美女在线播放 | 美女被男人插 | 黑人巨大精品一区二区在线 | 国产成人综合在线 | 欧美一区三区 | 国产在线免费视频 | 欧美大片xxx | 免费激情小视频 | 日日日夜夜操 | 日韩欧美福利 | 91中文字幕在线视频 | 精品婷婷色一区二区三区蜜桃 | 少妇又紧又色又爽又刺激 | 91精品国产91久久久久久 | 成人免费a级片 | 国产激情综合 | 成人午夜网址 | 日本成人一二三区 | 国产精品va | 69sex久久精品国产麻豆 | 麻豆黄色网址 | www.一起操 | 久久.com| 91麻豆成人精品国产 | 另类欧美日韩 | 一边摸内裤一边吻胸 | 精品免费一区二区三区 | 日本免费黄色网址 | 欧美成人一级视频 | 国产精品色 | 999一区二区三区 | 中国亚洲女人69内射少妇 | 黄色网页网站 | 女性裸体无遮挡胸 | 亚洲人成电影在线 | 国产欧美亚洲一区 | 黄色免费一级片 | 高清av免费观看 | 日本理论视频 | 精品人妻无码一区二区色欲产成人 | 成在线人免费视频 | 美女扒开尿口给男人桶 | 男生和女生一起差差差视频 | 午夜欧美精品久久久久久久 | 操极品少妇 | 一二三区在线播放 | 免费看a视频 | 亚洲永久精品一区二区 | 亚洲视频在线观看免费视频 | 日韩欧美卡一卡二 | 免费色网址 | 麻豆视频网站在线观看 | 久久欧美 | 曰女同女同中文字幕 | 中文字幕免费高清 | 亚洲精品国产精品国自产网站按摩 | 日韩高清在线 | 丁香六月激情综合 |