我也是第一次寫知乎專欄,所以有些地方弄的不好,也請見諒。
首先我們明確自己目標---將自己所擁有的視頻轉換成為素描視頻,所以我們得現有一段視頻(如下即為我的示例視頻)
我們先學會進行圖片處理(視頻也就是很多張照片組成的)
src1 即可默認為我們事先載入的一張圖片<可表示為 Mat src1=imread("1.jpg「);>
Mat gray,dst; //然後也就是我們在定義幾個變數(圖片其實也就是矩陣)
cvtColor(src1,gray,COLORBGR2GRAY); //將src1彩色圖片轉換成為灰色度圖片(src1輸入圖片,gray為輸出的灰色圖片,COLOR_BGR2GRAY即可默認為輸出灰色度圖片),因為只有圖片為灰色度,其才會有閾值<範圍是0~255>(也就是下文的Threshold函數),同樣這第三個參數也有很多種,有興趣可以自己去找下。、
GaussianBlur(gray,dst,Size(3,3),0,0); //高斯去噪,其第一個參數為輸入圖像,第二個參數為輸出圖像,第三個也就是高斯內核(ksize.width,ksize.height)也就是橫縱坐標方向下的模糊,但是它們都必須為正數且奇數,第四,第五個參數分別表示為高斯核函數在X,Y方向下的標準偏差,第六個參數一般有默認值我們可以不去管。(PS 我個人對這個函數理解即為將3x3的高斯內核函數去與原圖像進行覆蓋,在一個3x3的內核上,各個色素帶的色素值進行加權平均,所以與原圖像比較會形成較為模糊圖像)貌似高斯模糊好像更加接近素描。
adpativeThreshold(dst, src1, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 7, 2);<自適應閾值操作>第一、第二個參數同樣為輸入輸出圖像,第三個與第五個參數有聯繫,第四個參數int類型的自適應閾值演算法,可以取值
ADAPTIVE_THRESH_GAUSSIAN_C:當取值為這時,閾值T(x,y)為blockSize*blockSize鄰域內(x,y)j減去第七個參數的平均值
ADAPTIVE_THRESH_MEAN_C :當取值為這時,閾值T(x,y)為blockSize*blockSize鄰域內(x,y)j減去第七個參數,然後與高斯窗交叉相關的加權和
第五個參數取值 THRESH_BINARY時
maxValue if(dst(x,y)>T(x,y))
輸出像素= 0 <
THRESH_BINARY_INV時
0 if(dst(x,y)>T(x,y))
輸出像素 = maxValue if(dst(x,y)<T(x,y))
第六個參數 用於計算閾值大小的一個像素鄰域尺寸(blocksize),一般取值為3,5,7;
第七個參數被減量(可見上文)
為了使素描效果更好可以重複幾次
Mat src2, src3, src4;
GaussianBlur(src1, src2, Size(3, 3), 0, 0);
//imshow("【蔡老師】", src2);
threshold(src2, src3, 200, 255, THRESH_BINARY);
//imshow("【蔡老師2】", src3);
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(src3, src4, 1, element); //為開運算可以消除一些圖像中的一些較小的黑點
GaussianBlur(src4, src4, Size(5, 5), 0, 0);
imshow("【蔡老師3】", src4); //即可顯示出來
{
Mat src1;
adaptiveThreshold(dst, src1, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 7, 2);
最後將視頻播放後,會發現素描後的視頻離奇的,大概有1.9G左右,此時需要下載軟體將其內存壓縮,推薦使用格式工廠感覺效果不錯,差不多輸出10多MB。
溜了溜了,明天還有課,感覺自己寫的好垃圾,加上自己也是入門不久,也不是計算機專業之類的,很多演算法原理我也不是很明白,只是通過效果圖加上網上註解才算能勉強看懂,這就是我寫那麼多imshow()的原因。
最近一段時間弄出來了檢測十字的程序找段時間更新掉hhhh(不過聽說視頻檢測區別很大)溜了溜了,熬不住了。