java blob是什么,讓我們一起了解一下?
Blob是計(jì)算機(jī)視覺(jué)圖像中的一塊連通區(qū)域,Blob分析的就是對(duì)前景或背景分離后的二值圖像,進(jìn)行連通域提取和標(biāo)記以及計(jì)算Blob的一些相關(guān)特征,而且通過(guò)Blob提取,還可以獲得相關(guān)區(qū)域的信息。
Blob分析的重要一個(gè)步驟是連通區(qū)域的確定,那么它的優(yōu)缺點(diǎn)是什么?
優(yōu)點(diǎn):
Blob在目標(biāo)跟蹤的優(yōu)勢(shì)有:
1、通過(guò)Blob提取,可以獲得相關(guān)區(qū)域的信息,這些信息可以作為邊緣監(jiān)測(cè)器或者角點(diǎn)檢測(cè)器的補(bǔ)充信息。在目標(biāo)識(shí)別中,Blob可以提供局部的統(tǒng)計(jì)信息和外貌信息,這些信息能夠?yàn)槟繕?biāo)識(shí)別和跟蹤提供依據(jù)。
2、可以利用Blob對(duì)直方圖進(jìn)行峰值檢測(cè)。
3、Blob還可以作為紋理分析和紋理識(shí)別的基元。
4、通過(guò)Blob分析,可以得到目標(biāo)的個(gè)數(shù)及其所在區(qū)域,在進(jìn)行目標(biāo)匹配時(shí),不需要對(duì)全局圖像進(jìn)行搜索。
缺點(diǎn):
1、速度過(guò)慢,要整個(gè)區(qū)域作逐點(diǎn)掃描。
2、Blob分析難度大。這是一純幾何學(xué)上的問(wèn)題,一個(gè)不規(guī)則的形狀,如何計(jì)算它的面積、大小沒(méi)有簡(jiǎn)單易行的算法,太過(guò)復(fù)雜,運(yùn)算時(shí)間就長(zhǎng),速度就更慢了。
3、實(shí)際應(yīng)用。Blob算法在實(shí)際應(yīng)用中,非常依賴光源。幾乎可以說(shuō),Blob算法如果離開(kāi)了一個(gè)可靠的光源設(shè)計(jì),則完全不起作用。
那么java是怎樣對(duì)Blob讀寫的?示例如下:
package?com.you.sister; ? import?java.io.BufferedInputStream; import?java.io.BufferedOutputStream; import?java.io.DataOutputStream; import?java.io.File; import?java.io.FileInputStream; import?java.io.FileOutputStream; import?java.io.InputStream; import?java.sql.Blob; import?java.sql.Connection; import?java.sql.DriverManager; import?java.sql.PreparedStatement; import?java.sql.ResultSet; import?java.util.Properties; ? public?class?BlobTest?{ ? public?static?Connection?conn; public?static?Connection?getConn()?throws?Exception?{ FileInputStream?fis?=?new?FileInputStream(new?File("jdbc.properties")); Properties?prop?=?new?Properties(); prop.load(fis); String?driver?=?prop.getProperty("jdbc.driver"); String?url?=?prop.getProperty("jdbc.url"); String?username?=?prop.getProperty("jdbc.username"); String?password?=?prop.getProperty("jdbc.password"); Class.forName(driver); return??DriverManager.getConnection(url,?username,?password); } public?static?void?main(String[]?args)?throws?Exception?{ conn?=?getConn(); readBlob(); writeBlob(); conn.close(); } /** *?從數(shù)據(jù)庫(kù)中讀大對(duì)象出來(lái) *?保存在本地 */ public?static?void?readBlob()?{ try?{ String?readSql?=?"select?*?from?emp?where?empno?=??"; PreparedStatement?ps?=?conn.prepareStatement(readSql); ps.setInt(1,?7369); ResultSet?rs?=?ps.executeQuery(); while?(rs.next())?{ Blob?image?=?rs.getBlob("image"); DataOutputStream?dos?=? //?在FileOutputStream中指定文件輸出路徑 new?DataOutputStream(new?FileOutputStream(7369?+?"_image.jpeg")); InputStream?fis?=?image.getBinaryStream(); int?out; byte[]?outByte?=?new?byte?[100]; //?將blob對(duì)象輸入流寫入本地輸出流中 while?((out?=?fis.read(outByte))?!=?-1)?{ dos.write(outByte); } fis.close(); dos.flush(); dos.close(); } rs.close(); ps.close(); }?catch?(Exception?e)?{ e.printStackTrace(); } } /** *?將大對(duì)象文件保存進(jìn)數(shù)據(jù)庫(kù)中 */ public?static?void?writeBlob()?{ try?{ BufferedInputStream?fis?=? new?BufferedInputStream(new?FileInputStream(new?File("D:\\Tulips.jpg"))); //?如果是新插入字段,則將大對(duì)象對(duì)應(yīng)字段插入為empty_clob(); //?如果是修改,則可以先update?該行數(shù)據(jù),將大對(duì)象對(duì)應(yīng)字段設(shè)置為empty_clob(); String?writeSql?=?"select?*?from?emp?where?empno?=???for?update"; PreparedStatement?ps?=?conn.prepareStatement(writeSql); ps.setInt(1,?7499); conn.setAutoCommit(false); ResultSet?rs?=?ps.executeQuery(); while?(rs.next())?{ oracle.sql.BLOB?image?=?(oracle.sql.BLOB)rs.getBlob("image"); BufferedOutputStream?bos?=?new?BufferedOutputStream(image.getBinaryOutputStream()); int?c; //?將實(shí)際文件中的內(nèi)容以二進(jìn)制的形式來(lái)輸出到blob對(duì)象對(duì)應(yīng)的輸出流中 while?((c?=?fis.read())?!=?-1)?{ bos.write(c); } fis.close(); bos.close(); } conn.commit(); rs.close(); ps.close(); }?catch?(Exception?e)?{ e.printStackTrace(); } } }
以上就是小編今天的分享了,希望可以幫助到大家。