1. 程式人生 > >基於opencv將視頻轉化為字符串Java版

基於opencv將視頻轉化為字符串Java版

com 1.2 stringbu 顯示 bili visible play git osi

基於opencv將視頻轉化為字符串Java版

opencv java

先上一個效果圖吧
技術分享圖片

首先,弄清一下原理

我們要將視頻轉化為字符畫,那麽就需要獲取畫面的每一幀,也就是每一張圖片,然後將圖片進行轉化,變成字符串,然後進行打印。

1.獲取視頻

在opencv中提供了一個函數去獲取視頻

VideoCapture capture = new VideoCapture("");//裏面放圖片的地址
//ps:如果裏面為0[不要"",就是整數0],則就對默認攝像頭進行抓取
Mat mat = new Mat();
//讀取下一幀
capture.read(mat);//返回值為boolean類型

設想一下,如果我們使用循環去讀取下一幀,那麽就可以源源不斷的得到視頻畫面

2.灰度轉換

先說一下圖片的轉換原理:我們是根據圖片像素點上面顏色的深淺來使用不同復雜程度的字符來替代它.那麽這時候我們就可以將圖片進行灰度轉換,顏色深的地方放復雜的字符就行了.

Mat img_mat = new Mat();
//mat表示要要轉換的圖片[Mat類型],img_mat表示轉換後的圖片
Imgproc.cvtColor(mat, img_mat, Imgproc.COLOR_RGB2GRAY);
//獲得圖片的灰度值  i,j 表示像素點的位置(姑且理解為像素點吧)
int gray = (int
) img_mat.get(i, j)[0];

3.字符串轉換

我們會根據灰度的大小放不同的字符

String ascii = "#8XOHLTI)i=+;:,. ";//字符串由復雜到簡單

StringBuilder result = new StringBuilder();
//使用for循環獲得圖像每一個地方的灰度值
for (int i = 0; i < img_mat.rows(); i+=14) {
    //i+14 j+14 每隔14取一個點 是防止視頻過大,產生的result過長,整個屏幕無法顯示完全
    for (int j = 0; j < img_mat.cols(); j+=14
) { StringBuilder result = new StringBuilder(); int gray = (int) img_mat.get(i, j)[0]; //Math.round進行四舍五入 int index = Math.round(gray * (ascii.length() + 1) / 255); result.append(index >= ascii.length() ? "." : String.valueOf(ascii.charAt(index))); } result = result.append("\n"); } //Ubuntu 進行清屏操作 System.out.print("\033c"); System.out.println(result);

註意:不要使用result+="",因為這個在很長的字符串上連接效率太慢.

總結

總的來說,就是根據視頻的灰度的大小,用不同復雜度的字符串來替代。
如果你喜歡這篇文章的話,就給個start?吧,項目下載地址:GitHub⊙﹏⊙∥∣°

≡(▔﹏▔)≡

opencv 在Ubuntu環境下的搭建我會在下篇講哦
<(‵^′)>

基於opencv將視頻轉化為字符串Java版