opencv編譯流程

一、結(jié)構(gòu)介紹
  • 1.1,視覺(jué)跟蹤需要用到opencv的trackering類,但官方的OpenCV releases并不包含opencv_contrib。所以在編譯的時(shí)候需要包含tracking晚碾。
二、編譯前的準(zhǔn)備
  • 2.1喂急,安裝Cmake格嘁,編譯腳本可以用cmake
  • 2.2,下載opencv指定版本的標(biāo)準(zhǔn)庫(kù)
  • 2.3廊移,下載opencv_contrib相同版本的貢獻(xiàn)庫(kù)
  • 2.4糕簿,根據(jù)這個(gè)路徑~/opencv/platforms/ios/build_framework.py找到build_framework,修改幾處基礎(chǔ)配置画机。(將 **--enable_nonfree**設(shè)置為**default=True**冶伞,默認(rèn)是False。由于項(xiàng)目只支持真機(jī)步氏,減少編譯時(shí)間可以將**--iphoneos_archs**為**armv7**)响禽。
  • 2.5,opencv_contrib庫(kù)中包含很多功能庫(kù)荚醒,我們只需用到tracking這個(gè)類芋类,所以可以直接從~/opencv_contrib/modules中找到tracking,移動(dòng)到~/opencv/modules中即可界阁。

2.5步驟是編譯的一種方式侯繁,若還需用到其他庫(kù)可以如下直接編譯
./OpenCV/
├── opencv-4.5.5/
└── opencv_contrib-4.5.5/
注解: 標(biāo)準(zhǔn)庫(kù)和貢獻(xiàn)庫(kù)必須在同一個(gè)目錄下編譯

三、編譯OpenCV
  • 3.1泡躯,切換到你的工作目錄贮竟,編譯后的文件將輸出到這個(gè)目錄(cd <yourWorkSpace>
  • 3.2,執(zhí)行編譯腳本方式一(將需要的功能庫(kù)移動(dòng)到opencv的modules種)python opencv/platforms/ios/build_framework.py ios
  • 3.3较剃,編譯腳本方式二(直接編譯標(biāo)準(zhǔn)庫(kù)和貢獻(xiàn)庫(kù), --contrib 參數(shù)指定為我們下周的擴(kuò)展包的目錄)python path/to/build_framework.py --contrib path/to/opencv_contrib iOS
四咕别、項(xiàng)目接入opencv2.framework
  • 4.1,F(xiàn)iFish項(xiàng)目中視覺(jué)追蹤有兩個(gè)版本(即VL1.0和VL2.0)写穴,但兩個(gè)版本底層也是通過(guò)OpenCV實(shí)現(xiàn)的惰拱。
  • 4.2,具體實(shí)現(xiàn)在QYVisionLockTrackerManager
#import <opencv2/opencv.hpp>
#import "opencv2/imgproc.hpp"
#import "qyTracker.h"
#import <opencv2/tracking/tracking_legacy.hpp>

{
    cv::Ptr<cv::legacy::TrackerMedianFlow> medianTracker; //  VL1.0 視覺(jué)跟蹤器
    QytTracker *tracker; // VL2.0 視覺(jué)跟蹤器
}

----------- VL1.0(VL1.0是直接和opencv交互) ----------- 
cv::Rect2d rect2d =  [self calculateRectInImageMat:dstMat sizeScale:sizeScale centerScale:centerScale];
medianTracker = cv::legacy::TrackerMedianFlow::create();
bool isTrackerInit = medianTracker->init(dstMat, rect2d);
self.isInitTracker = isTrackerInit;
complete([self calculateRectWithScreenScale:sizeScale centerScale:centerScale] ,isTrackerInit);

----------- VL2.0(VL2.0是與算法交互) ----------- 
 if (tracker == NULL) {
   tracker = new QytTracker();
  }
 cv::Rect bbox = [self calculateRectInImageSize:dstMat sizeScale:sizeScale centerScale:centerScale];
 tracker->init(dstMat, bbox);
 self.isInitTracker = YES;
 complete([self calculateRectWithScreenScale:sizeScale centerScale:centerScale] ,YES);
  • 4.3啊送,算法需要的類型的cv:Mat類型偿短,所以需要將yuv轉(zhuǎn)成cv:Mat類型
// yuv轉(zhuǎn)cv::Mat
- (cv::Mat)dstMatWithYuv:(uint8_t *)yuv_frame width:(int)width height:(int)height {
    cv::Mat dstMat;
    cv::Mat rgbMat;
    if (yuv_frame == nil) {
        return rgbMat;
    }
    cv::Mat yuvMat(height+height/2, width, CV_8UC1, yuv_frame);
    if (yuvMat.empty()) {
        return rgbMat;
    }
    rgbMat = cv::Mat(height,width,CV_8UC3);
//    // COLOR_YUV2BGR_I420  COLOR_YUV2BGR_NV12
    if (rgbMat.empty()) {
        return rgbMat;
    }

    cv::cvtColor(yuvMat, rgbMat, COLOR_YUV2BGR_I420, 3);
//    if (rgbMat.rows > mMatScaleTargetHeight) {
//        double h = (double)height;
//        double w = (double)width;
//        int dstWidth = mMatScaleTargetHeight / h * w;
//        rgbMat.copyTo(dstMat);
////        cv::resize(rgbMat, dstMat, cv::Size(dstWidth, mMatScaleTargetHeight), 0, 0, INTER_AREA); // resize CPU占用有點(diǎn)大
//    } else {
//        rgbMat.copyTo(dstMat);
//    }
    rgbMat.copyTo(dstMat);
    yuvMat.release();
    rgbMat.release();
    return dstMat;
}

注解: cv::resize()函數(shù)會(huì)造成CPU增加欣孤, 所以在詢問(wèn)算法組的同事后表示可以注釋這個(gè)函數(shù)。
總結(jié)

優(yōu)化點(diǎn):

  • 1.0昔逗,VisionLock 底層算法是CPU處理降传,所以在使用久了后,手機(jī)會(huì)發(fā)燙勾怒,已反饋給算法組的同事搬瑰, 同時(shí)需要查出上層代碼能增加CPU的地方,eg:上次檢測(cè)出cv::resize()函數(shù)會(huì)增加CPU控硼。
  • 1.1,由于播放器不同艾少,獲取到的視頻幀格式不同(可能是NV12卡乾、P420、imageBuffer)缚够,這里可以優(yōu)化下代碼幔妨,看看能不能有更好的兼容性。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谍椅,一起剝皮案震驚了整個(gè)濱河市误堡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雏吭,老刑警劉巖锁施,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異杖们,居然都是意外死亡悉抵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門摘完,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)姥饰,“玉大人,你說(shuō)我怎么就攤上這事孝治×蟹啵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵谈飒,是天一觀的道長(zhǎng)岂座。 經(jīng)常有香客問(wèn)我,道長(zhǎng)步绸,這世上最難降的妖魔是什么掺逼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮瓤介,結(jié)果婚禮上吕喘,老公的妹妹穿的比我還像新娘赘那。我一直安慰自己,他們只是感情好氯质,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布募舟。 她就那樣靜靜地躺著,像睡著了一般闻察。 火紅的嫁衣襯著肌膚如雪拱礁。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天辕漂,我揣著相機(jī)與錄音呢灶,去河邊找鬼。 笑死钉嘹,一個(gè)胖子當(dāng)著我的面吹牛鸯乃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跋涣,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼缨睡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了陈辱?” 一聲冷哼從身側(cè)響起奖年,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沛贪,沒(méi)想到半個(gè)月后陋守,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡利赋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年嗅义,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隐砸。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡之碗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出季希,到底是詐尸還是另有隱情褪那,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布式塌,位于F島的核電站博敬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏峰尝。R本人自食惡果不足惜偏窝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧祭往,春花似錦伦意、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至已骇,卻和暖如春离钝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褪储。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工卵渴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲤竹。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓奖恰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親宛裕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容