“利用可見光傳輸信息的軟件”項目簡介(二)

團隊——天亮說晚安

視頻解碼模塊

//生成遮罩
std::vector<cv::Mat> mask(8);
for(int i = 0; i < 8; i++) {
   mask[i] = ...
}

目前,項目讀取編碼的手段是將圖像根據(jù)定位點將圖像尺寸還原奢米,用遮罩捕獲目標區(qū)域炕泳,所以需要先初始化std::vector<mask>

std::vector<cv::Mat>video_pro;
for (int k = 0; k < frames ; k++) {
   //彩色轉(zhuǎn)灰度
   cv::cvtColor(src, src, cv::COLOR_RGB2GRAY);

   //閾值
   int SRC_THRESH_LOW = this->THRESH;
   cv::threshold(src, src, SRC_THRESH_LOW, 255, cv::THRESH_BINARY);

   //Canny邊緣檢測
   cv::Mat src_gray = src;
   cv::Mat canny_output;
   cv::Canny(src_gray, canny_output, 200, 255);

   //輪廓提取
   std::vector<std::vector<cv::Point> > contours;
   std::vector<cv::Vec4i> hierarchy;
   cv::findContours(canny_output, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

   if(contours.size()<1)//若提取失敗源哩,跳過此幀
       continue;

   //提取最大矩形知态,即屏幕現(xiàn)實范圍
   cv::Rect poly_rect_max=cv::boundingRect(contours[0]);
   for (int i = 1; i < contours.size(); i++) {
        if(poly_rect_max.area()<cv::boundingRect(contours[i]).area())
             poly_rect_max=cv::boundingRect(contours[i]);
   }

   //ROI坐標生成 tl=topleft,br=bottomright
   int tl_x =  poly_rect_max.tl().x;
   int br_x =  poly_rect_max.br().x;
   int tl_y =  poly_rect_max.tl().y;
   int br_y =  poly_rect_max.br().y;

   //ROI區(qū)域生成
   cv::Rect rect(tl_x, tl_y, br_x - tl_x, br_y - tl_y);
   cv::Mat srcRoi=cv::Mat::zeros(src.size(), CV_8UC1);
   srcRoi=src(rect);
   cv::resize(srcRoi, srcRoi, RSFRAME);

   //存入預降噪vector保存
   video_pro.push_back(srcRoi);
}

這一步是降噪得以實現(xiàn)的核心,通過電腦屏幕底色的白色倒得,將目標區(qū)域初步的提取出來,降低外部的噪聲夭禽。cv::cvtColor()霞掺、cv::threshold()實現(xiàn)初步的噪聲去除,cv::Canny()讹躯、cv::findContours提取出ROI區(qū)域和相應的輪廓菩彬,將輪廓外的區(qū)域全部消除。此步本應該為可選項潮梯,但是該段邏輯在Release 1.0的版本本是被強制執(zhí)行的骗灶,會出現(xiàn)用戶很精準的沒有錄入噪聲,卻讀取失敗的情況秉馏,Beta 2.0版本中擬予以優(yōu)化耙旦。

std::vector<cv::Mat> video_diff;
for(int i=1;i<video_pro.size();i++){
   //差值
   cv::Mat st=video_pro[i]-video_pro[i-1];

   //形態(tài)學開
   cv::Mat kernelsrc = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(23, 23), cv::Point(-1, -1));
   cv::morphologyEx(st, st, cv::MORPH_OPEN, kernelsrc);

  //存入差值vector

  video_diff.push_back(st);
}

使用幀差法有兩個目的,第一個是進一步去除噪聲萝究。第二目的是捕獲關鍵幀免都。這里的關鍵幀是指清晰成像的,帶有信息的圖像帆竹。實際幀之間做差時绕娘,有三種情況:

  • [i-1]幀為空白幀,[i]幀為關鍵幀(無論清晰與否栽连,下同)——這時险领,由于減去白色的緣故,[i]幀信息全部丟失秒紧。
  • [i-1]幀為關鍵幀绢陌,[i]也為關鍵幀——做差后,[i]會刪去大部分信息噩茄,留下一些無用的噪點下面。
  • [i-1]幀為關鍵幀,[i]空白幀——這時绩聘,空白幀[i]會因為剪掉了信息區(qū)域外的黑色而保留信息區(qū)域沥割。

這個時候耗啦,理論上,第一種情況產(chǎn)生黑色空白幀直接被忽略机杜,第二種情況在形態(tài)學開操作cv::morphologyEx()的處理下帜讲,退化為黑色空白幀,只有第三種情況產(chǎn)生的幀會被捕獲椒拗。但在實際解算時似将,由于灰階響應的緣故,閾值后的信息會出現(xiàn)不完整的情況蚀苛。這種情況會直接導致程序不正常退出或者OpenCV斷言錯誤在验,實際UI顯示為卡66%的進度。
Relese 1.0版本中這個現(xiàn)象尤為嚴重堵未,因此為Relese 2.0版本發(fā)布前的重中之重腋舌。

for(int i=0;i<video_diff.size();i++){
   //過濾低信息圖片
   if(cv::countNonZero(video_diff[i])==0)
       continue;
   cv::Mat read=video_diff[i];
   //Canny邊緣查找
   cv::Mat src_gray = read;
   cv::Mat canny_output;
   cv::Canny(src_gray, canny_output, 200, 255);

   //輪廓查找
   std::vector<std::vector<cv::Point> > contours;
   std::vector<cv::Vec4i> hierarchy;
   cv::findContours(canny_output, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
   if(contours.size()<=2)
       continue;
   //從輪廓生成最小矩形
   std::vector<cv::Rect>poly_rect(contours.size());
   for (int i = 0; i < contours.size(); i++) {
      poly_rect[i] = cv::boundingRect(contours[i]);
   }
   //矩形輪廓x坐標整理
   for (int i = poly_rect.size(); i > 0; i--) {
       for (int j = 0; j < i - 1; j++) {
           if (poly_rect[j].tl().x > poly_rect[j + 1].tl().x)
               swap(poly_rect[j], poly_rect[j + 1]);
       }
   }
   //矩形輪廓y坐標整理
   for (int i = 0; i + 1 < poly_rect.size(); i += 2) {
       if (poly_rect[i].tl().y > poly_rect[i + 1].tl().y)
            swap(poly_rect[i], poly_rect[i + 1]);
   }

   //ROI坐標生成 tl=topleft,br=bottomright
   int tl_x = poly_rect[0].tl().x;
   int br_x = poly_rect[poly_rect.size() - 1].br().x;
   int tl_y = poly_rect[0].tl().y;
   int br_y = poly_rect[poly_rect.size() - 1].br().y;
   if(tl_x&&br_x&&tl_y&&br_y==0)
       continue;

   //矩形輪廓重建
   cv::Mat rscrc = cv::Mat::zeros(canny_output.size(), CV_8UC1);
   for (int i = 0; i < poly_rect.size(); i++) {
       cv::rectangle(rscrc, poly_rect[i], WHITE, cv::FILLED);
   }

   //ROI區(qū)域生成
   cv::Rect rect(tl_x, tl_y, br_x - tl_x, br_y - tl_y);
   cv::Mat srcRoi=cv::Mat::zeros(rscrc.size(), CV_8UC1);
   srcRoi=rscrc(rect);
   cv::resize(srcRoi, srcRoi, RSFRAME);

   //解碼
   char c=0;
   for (int i = 7; i >= 0; i--) {
       //緩存幀
       cv::Mat p = cv::Mat::zeros(RSFRAME, CV_8UC1);

       //添加遮罩
       p = srcRoi-mask[i];

       //譯碼
       if (cv::countNonZero(p) >500)
           c |= 0x01;
       if (i != 0)
           c <<= 1;
   }
}

最后解碼階段,相當于第一步的復現(xiàn)渗蟹,沒有新的內(nèi)容块饺,最后的循環(huán)實現(xiàn)了解碼,相當于編碼的逆過程雌芽。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末授艰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子世落,更是在濱河造成了極大的恐慌淮腾,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岛心,死亡現(xiàn)場離奇詭異来破,居然都是意外死亡,警方通過查閱死者的電腦和手機忘古,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門徘禁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人髓堪,你說我怎么就攤上這事送朱。” “怎么了干旁?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵驶沼,是天一觀的道長。 經(jīng)常有香客問我争群,道長回怜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任换薄,我火速辦了婚禮玉雾,結(jié)果婚禮上翔试,老公的妹妹穿的比我還像新娘。我一直安慰自己复旬,他們只是感情好垦缅,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驹碍,像睡著了一般壁涎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上志秃,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天怔球,我揣著相機與錄音,去河邊找鬼洽损。 笑死庞溜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的碑定。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼又官,長吁一口氣:“原來是場噩夢啊……” “哼延刘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起六敬,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤碘赖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后外构,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體普泡,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年审编,在試婚紗的時候發(fā)現(xiàn)自己被綠了撼班。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡垒酬,死狀恐怖砰嘁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勘究,我是刑警寧澤矮湘,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站口糕,受9級特大地震影響缅阳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜景描,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一十办、第九天 我趴在偏房一處隱蔽的房頂上張望秀撇。 院中可真熱鬧,春花似錦橘洞、人聲如沸捌袜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虏等。三九已至,卻和暖如春适肠,著一層夾襖步出監(jiān)牢的瞬間霍衫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工侯养, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留敦跌,地道東北人。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓逛揩,卻偏偏與公主長得像柠傍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辩稽,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350