想請問下大佬們,有沒有什么方法bufferimage轉byte不走IO流,我們現在的業務是對視頻流做實時圖片分析,對視頻進行截圖,圖片大小是1920*1080的,然后將bufferimge物件轉成byte陣列傳給python那邊進行分析,再通過他們的介面回傳,但是bufferimage轉byte走IO流的話要耗時100ms左右,有沒有什么更快的辦法,或者有沒有什么框架技術可以介紹下,在網上找了好久都沒有找到相關的。
有沒有可能可以將這個時間降低到20ms左右~!想做到1秒可以處理至少20幀圖。
uj5u.com熱心網友回復:
BufferImage? 哪個包的uj5u.com熱心網友回復:
public static byte[] imageToBytes(BufferedImage bImage, String format) {ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ImageIO.write(bImage, format, out);
} catch (IOException e) {
e.printStackTrace();
}
return out.toByteArray();
}
uj5u.com熱心網友回復:
這樣算不算?BufferedImage image = your_ bufferimage;
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(image,"gif",out);
byte []data = out.toByteArray();
uj5u.com熱心網友回復:
考慮用多執行緒,而且你讀取資料怎么也繞不過IO,只是個人覺得慢可能在于傳輸,而不在于讀取圖片io上uj5u.com熱心網友回復:
就是樓下的那個代碼~
uj5u.com熱心網友回復:
就是這一步,ImageIo.wirte這里寫流得時候處理1920*1080的圖片用了100多ms,感覺好慢
uj5u.com熱心網友回復:
這一步也有考慮過能不能用多執行緒,這個實時處理圖片,都是在單執行緒里面處理,我測過了時間,圖片物件流處理Image.write這一步花了100多ms,整一個方法里面這一步拖慢了
uj5u.com熱心網友回復:
你的bufferimage是怎么來的?你能從視頻流里取得一個bufferimage,應該也有相應的api從視頻流直接取得byte陣列,查看一下你的視頻流類都提供了什么介面。
uj5u.com熱心網友回復:
我比較好奇,byte陣列是通過什么途徑傳給python的。BufferedImage 這個物件是把圖片的所有像素點的資料都快取在記憶體中的。
所有圖片都有格式的。
你呼叫ImageIO#write(...)方法時,會將記憶體中的所有像素點進行壓縮和轉換,很消耗CPU。
如果byte陣列傳給python的途徑使用了IO(比如硬碟檔案,網路通訊等),那么,速度自然不會達到樓主的要求了。
想解決問題,就先弄清楚各個環節的細節問題。
uj5u.com熱心網友回復:
哦。我看樓主一直沒有回復我的問題,我就再多說一句。如果一幅圖片最多消耗100ms的CPU時間,那么,你要是想降低到20ms的話,可以開啟5個執行緒同時進行處理。
當然,硬體方面,CPU要6核心及大于6核心的才行。注意,是物理核心,不是超執行緒的那個數。
這樣的話,在不考慮延遲的情況下,大概可以滿足1秒20幀的吞吐量。
影像處理,是計算機的一個比較專業的門類,感覺和密碼學差不多,學深了很難,需要很扎實的數學功底。
目前,如果沒有計算機圖形學相關的知識背景的話,我們要做的是了解這個處理程序,各個環節都干了哪些事情,只要細節掌握的夠細致,解決起問題來就會變得容易。
比如,如果python那么可以接受不壓縮的byte陣列,那么,你在呼叫ImageIO輸出時就可以選擇不用壓縮的圖片格式,這樣就可以省去很多CPU的計算程序,從而減少處理時間。如果向python傳遞byte陣列的程序是通過硬碟檔案或者網路socket通信的話,可以考慮將python的演算法移植到Java平臺,Java不是開源的么,如果演算法不是太偏門,Java應該會找到同樣演算法的實作,或者同型別的演算法平臺,這樣就可以省去資料傳輸的時間。
為什么非要做這些呢?
因為樓主的需求是毫秒級的資料處理。
計算機的處理能力本身就是毫秒級的,如果你要求也是毫秒級的,那么,軟硬體的要求,都會變得很苛刻。
如果你想同時處理多個實時視頻,那還會可能用到分布式計算和CUDA計算。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/57023.html
標籤:Java相關
