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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

calcBackProject函数(搜索小物体的位置)

發布時間:2025/4/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 calcBackProject函数(搜索小物体的位置) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

calcBackProject的輸入通常為目標區域的直方圖和待跟蹤圖像的直方圖,輸出與待跟蹤圖像大小相同,每一個像素點表示該點為目標區域的概率。這個點越亮,該點屬于物體的概率越大。


步驟:

1.使用一幅只包含小物體的圖片(圖片大小和物體一樣大即可, 不需要向上一篇同樣大),計算其二維直方圖 (HSV空間中的 h(亮度)和 s (飽和度) 二維直方圖 ? (還可以和圖像的梯度和(或)梯度角度結合起來,查找紋理相似 和(或) 顏色相似

2.輸入一幅待搜索的圖片, 轉化為HSV空間 ,只取h 和 s 分量

3. 設置搜索塊大小和物體大小相同(即和第1步中圖片大小相同) ,使用cvCalcBackProjectPatch反向塊投影 和圖片result

4.在result中取最大值所在位置,即可得到物體在輸入圖片中的位置了。 (或者設定一個閾值)

示例程序如下:

[cpp]?view plaincopy
  • #include?<iostream>??
  • #include?<cv.h>??
  • #include?<highgui.h>??
  • #include?<cxcore.h>??
  • ??
  • using?namespace?std;??
  • ??
  • void?GetHSV(const?IplImage?*image,IplImage?**h,IplImage?**s,IplImage?**v);??
  • ??
  • int?main()??
  • {??
  • ????IplImage?*src?=?cvLoadImage("f:\\images\\bluecup.jpg");??
  • ????IplImage?*h_src?=?NULL?,*s_src?=?NULL;??
  • ????GetHSV(src,&h_src,&s_src,NULL);??
  • ????IplImage?*images[]?=?{h_src,s_src};??
  • ????CvHistogram?*hist_src;??
  • ????{//計算二維直方圖??
  • ????????int?dims?=?2;??
  • ????????int?size[]?=?{30,32};?//?這個地方不要取的太大!??
  • ????????//當取為size[]?=?{180,256}時E7200CPU會運行長達10幾分鐘的!??
  • ????????float?range_h[]?=?{0,180}?//再用cvCvtColor轉換時h已經歸一化到180了??
  • ????????????,range_s[]?=?{0,256};??
  • ????????float?*ranges[]?=?{range_h,range_s};??
  • ????????hist_src?=?cvCreateHist(dims,size,CV_HIST_ARRAY,ranges);??
  • ????????cvCalcHist(images,hist_src);??
  • ????????cvNormalizeHist(hist_src,1);??
  • ????}??
  • ??
  • ????IplImage?*dst?=?cvLoadImage("f:\\images\\adrian1.jpg");??
  • ????IplImage?*h_dst?=?NULL,*s_dst?=?NULL;??
  • ????GetHSV(dst,&h_dst,&s_dst,NULL);??
  • ????images[0]?=?h_dst?,images[1]?=?s_dst;???
  • ??
  • ????CvSize?patch_size?=?cvSize(src->width,src->height);??
  • ????IplImage?*result?=?cvCreateImage(cvSize(h_dst->width?-?patch_size.width?+1,h_dst->height?-?patch_size.height?+1)??
  • ????????,IPL_DEPTH_32F,1);//塊搜索時處理邊緣是直接舍去,故result的大小比dst小path_size大小??
  • ????//32F類型,取值為0~1最亮為1,可直接顯示??
  • ????//CV_COMP_CORREL相關度,1時最匹配,0時最不匹配??
  • ????cvCalcBackProjectPatch(images,result,patch_size,hist_src,CV_COMP_CORREL,1);??
  • ????cvShowImage("result",result);??
  • ??????
  • ????//找出最大值位置,可得到此位置即為杯子所在位置??
  • ????CvPoint?max_location;??
  • ????cvMinMaxLoc(result,NULL,NULL,NULL,&max_location,NULL);??
  • ????//加上邊緣,得到在原始圖像中的實際位置??
  • ????max_location.x?+=?cvRound(patch_size.width/2);??
  • ????max_location.y?+=?cvRound(patch_size.height/2);??
  • ????//在dst圖像中用紅色小圓點標出位置??
  • ????cvCircle(dst,max_location,3,CV_RGB(255,0,0),-1);??
  • ??
  • ????cvShowImage("dst",dst);??
  • ????cvWaitKey();??
  • ??
  • ????cvReleaseImage(&src);??
  • ????cvReleaseImage(&dst);??
  • ????cvReleaseImage(&h_src);??
  • ????cvReleaseImage(&h_dst);??
  • ????cvReleaseImage(&s_dst);??
  • ????cvReleaseImage(&s_src);??
  • ????cvReleaseHist(&hist_src);??
  • ????cvReleaseImage(&result);??
  • ????cvDestroyAllWindows();??
  • }??
  • ??
  • void?GetHSV(const?IplImage?*image?,?IplImage?**h,IplImage?**s,IplImage?**v)??
  • {??
  • ????IplImage?*hsv?=?cvCreateImage(cvGetSize(image),8,3);??
  • ????cvCvtColor(image,hsv,CV_BGR2HSV);??
  • ??????
  • ????if((h?!=?NULL)?&&?(*h?==?NULL))??
  • ????????*h?=?cvCreateImage(cvGetSize(image),8,1);??
  • ????if((s?!=?NULL)?&&?(*s?==?NULL))??
  • ????????*s?=?cvCreateImage(cvGetSize(image),8,1);??
  • ????if((v?!=?NULL)?&&?(*v?==?NULL))??
  • ????????*v?=?cvCreateImage(cvGetSize(image),8,1);??
  • ??
  • ??
  • ????cvSplit(hsv,*h,(s?==?NULL)?NULL:*s,(v==NULL)?NULL:*v,NULL);??
  • ????cvReleaseImage(&hsv);??
  • }??
  • 第一步物體圖片src剛好包含要搜索的物體:



    第二步輸入圖像即待搜索的圖像如下:

    ?

    在我的E7200 CPU , 1GB內存 上大概運行了20秒內吧,將size內的數應該可以再適當改的更小此,速度就會提高更多了

    結果如下(見圖中紅色小圓圈標記出來):



    若待搜索的圖片里有多個此物體,也是可以通過這種方法找出來的


    產于cvCalcBackProjectPatch的大概意義 ,

    按我的理解的話,應該是通過塊窗口搜索圖像,比較窗口中對應像素的二維直方圖與給定直方圖的差異,若完全相同,那當然就越匹配

    對于不同的相關度方法,越匹配,其值由相關度方法而定,

    如本程序使用的是

    [cpp]?view plaincopy
  • CV_COMP_CORREL??
  • 即越相似,則值越接近1. 反之則趨于0



    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的calcBackProject函数(搜索小物体的位置)的全部內容,希望文章能夠幫你解決所遇到的問題。

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