我也是第一次寫知乎專欄,所以有些地方弄的不好,也請見諒。

首先我們明確自己目標---將自己所擁有的視頻轉換成為素描視頻,所以我們得現有一段視頻(如下即為我的示例視頻)

視頻封面

00:59


我們先學會進行圖片處理(視頻也就是很多張照片組成的)

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); //即可顯示出來

面我會將代碼公布#include<opencv2/opencv.hpp>using namespace cv;int main()

{

VideoCapture capture("1.mp4"); //讀入視頻 //VideoWriter writer("cxk.avi", -1, 25.0, Size(320, 240)); Size size = Size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT));//獲取當前幀的寬度與高度 VideoWriter writer; writer.open("cxk.avi", -1, 20, size, false); while (1) {

Mat src1;

capture >> src1; if (src1.empty()) { break; } //imshow("【原圖】", src1); Mat gray, dst; cvtColor(src1, gray, COLOR_BGR2GRAY); GaussianBlur(gray, dst, Size(3, 3), 0, 0);

adaptiveThreshold(dst, src1, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 7, 2);

//imshow("【蔡老師】", src1); 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); //imshow("【蔡老師3】", src4);

GaussianBlur(src4, src4, Size(5, 5), 0, 0);

imshow("【蔡老師3】", src4); writer << src4;if (waitKey(20) == 27) //按下ESC鍵退出 break; } return 0;}
視頻封面

01:12

最後將視頻播放後,會發現素描後的視頻離奇的,大概有1.9G左右,此時需要下載軟體將其內存壓縮,推薦使用格式工廠感覺效果不錯,差不多輸出10多MB。


溜了溜了,明天還有課,感覺自己寫的好垃圾,加上自己也是入門不久,也不是計算機專業之類的,很多演算法原理我也不是很明白,只是通過效果圖加上網上註解才算能勉強看懂,這就是我寫那麼多imshow()的原因。

最近一段時間弄出來了檢測十字的程序找段時間更新掉hhhh(不過聽說視頻檢測區別很大)溜了溜了,熬不住了。


推薦閱讀:
相关文章