1. 程式人生 > >將pgm圖片使用Sequence file儲存到hdfs,並讀取為Mat陣列格式

將pgm圖片使用Sequence file儲存到hdfs,並讀取為Mat陣列格式

<pre name="code" class="java">package opencvImageSeq;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BufferedFSInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;

import java.io.*;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by lwc on 5/23/16.
 */
public class ImageSeqWriter {

    public static void main(String[] args) throws Exception {
        File inputDir = new File("/home/test/att_faces/s1");
        if(!inputDir.isDirectory()) {
            throw new Exception("input dir is wrong");
        }
        File[] inputFiles = inputDir.listFiles();
        List<String> imageNames = new ArrayList<>();
        InputStream inputStream = null;

        String uri = "hdfs://localhost:9000/home/hdfs/pgm2.seq";
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(uri), conf);
        Path path = new Path(uri);
        Text key = new Text();
        Text value = new Text();
//        SequenceFile.Writer writer;
//        writer = SequenceFile.createWriter(fs, conf, path,key.getClass(), value.getClass());
        SequenceFile.Writer writer = SequenceFile.createWriter(conf,
                SequenceFile.Writer.file(path), SequenceFile.Writer.keyClass(Text.class),
                SequenceFile.Writer.valueClass(Text.class));
        for (File file: inputFiles) {
            inputStream = new BufferedInputStream(new FileInputStream(file));
            String imageName =file.toString().substring(file.toString().lastIndexOf('/') + 1);
            imageNames.add(imageName);
            key = new Text(imageName);
            value = new Text();
            byte[] buffer = new byte[1024];

            while ((inputStream.read(buffer))!= -1) {
                value.set(buffer);
                writer.append(key, value);//將每條記錄追加到SequenceFile.Writer例項的末尾
                value.clear();
            }
        }
        for (String name: imageNames
             ) {
            System.out.println(name);
        }
        IOUtils.closeStream(inputStream);
        IOUtils.closeStream(writer);
    }
}

package opencvImageSeq;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by lwc on 5/23/16.
 */
public class ImageSeqReader {
    public static void main(String[] args) throws Exception {

        String uri = "hdfs://localhost:9000/home/hdfs/pgm2.seq";
        String baseDir = "/home/test/result/";
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(uri), conf);
        Path path = new Path(uri);

//        SequenceFile.Reader reader = new SequenceFile.Reader(fs, path, conf);
        SequenceFile.Reader reader = new SequenceFile.Reader(conf,SequenceFile.Reader.file(path));
        Map<Text, OutputStream> keyStream = new HashMap<>();
        Text key = new Text();
        Text  value = new Text();

        while (reader.next(key,value)) {
            if(!keyStream.containsKey(key)) {
                keyStream.put(key, new FileOutputStream(baseDir + key));
            }
            keyStream.get(key).write(value.getBytes());
            value.clear();
        }
        for (HashMap.Entry out : keyStream.entrySet()) {
            ((FileOutputStream)out.getValue()).flush();
            IOUtils.closeStream((FileOutputStream)out.getValue());
        }
        IOUtils.closeStream(reader);
    }
}

package opencvImageSeq;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;

import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by lwc on 5/23/16.
 */
public class ImageSeqMatReader {
    public static void main(String[] args) throws Exception {

        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        String uri = "hdfs://localhost:9000/home/hdfs/pgm2.seq";
        List<Mat> mats = new ArrayList<>();
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(uri), conf);
        Path path = new Path(uri);
//        SequenceFile.Reader reader = new SequenceFile.Reader(fs, path, conf);
        SequenceFile.Reader reader = new SequenceFile.Reader(conf,SequenceFile.Reader.file(path));
        Map<Text, OutputStream> keyStream = new HashMap<>();
        Text key = new Text();
        Text  value = new Text();

        while (reader.next(key,value)) {
            if(!keyStream.containsKey(key)) {
                keyStream.put(key, new ByteArrayOutputStream(1024));
            }
            System.out.println(key.toString() + " key");
            keyStream.get(key).write(value.getBytes(), 0, value.getLength());
            value.clear();
        }
        Mat mat ;
        ByteArrayOutputStream bs = null;
        for (HashMap.Entry out : keyStream.entrySet()) {
            bs = ((ByteArrayOutputStream)out.getValue());
            bs.flush();
            mat = Imgcodecs.imdecode(new MatOfByte(bs.toByteArray()),Imgcodecs.CV_LOAD_IMAGE_UNCHANGED);
            mats.add(mat.clone());
        }
        IOUtils.closeStream(bs);
        IOUtils.closeStream(reader);
        int i = 10;
        System.out.println(mats.size() + " size");
        for (Mat mat1: mats) {
            Imgcodecs.imwrite("/home/test/" + i++ + ".pgm" ,mat1);
        }
    }
}


相關推薦

pgm圖片使用Sequence file儲存hdfs讀取Mat陣列格式

<pre name="code" class="java">package opencvImageSeq; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Buf

基於Java的YUV圖片檔案提取Y分量構建灰度圖

YUV檔案對影象的一種較為普遍的編碼方式,Y表示亮度(Luminance、Luma),U代表色度(Chrominance)、V代表飽和度(Chroma);YUV格式的編碼的誕生有效地相容了黑白電視和彩色電視。相對於較為平常的RGB三通道影象,YUV格式編碼的影象視訊檔案在傳輸中佔據較小的頻寬。

二進制數據圖片保存到數據庫讀取數據庫二進制數據顯示圖片

returns tco 新建 讀取 指定路徑 stat 指定 字節數 圖片轉換 一. 瀏覽圖片 OpenFileDialog ofd = new OpenFileDialog(); ofd.InitialDirectory = @"E:\";

Flume1.4 相關引數設定收集的資料彙總到hdfs解決許多小檔案問題

參照官方文件,將 flume client 收集的日誌檔案 彙總到  flume sink收集端,然後儲存到hdfs 中,預設會按生成許多小檔案,如圖所示 實際中可能只需要生成一個檔案即可,這就涉及到了幾個相關引數設定如下即可 需要修改的檔案位於 flume/con

Java實現base64圖片轉換base64字串。base64字串轉換圖片 之間的互相轉換儲存在本地。

java實現Base64資料圖片和資料間的互相轉換 首先建立類。寫兩個方法: 圖片轉base64字串方法:GetImageStr(); 字串轉為圖片方法:GenerateImage(); pa

本地圖片上傳儲存到資料庫(理論上支援各種檔案的上傳)

//取得檔案的具體大小 int doclen = this.File1.PostedFile.ContentLength; //設定快取的具體大小 byte[] docB

ASP.Net圖片以二進位制方式存入資料庫讀取

今天研究了一下如何將圖片已二進位制形式存入資料庫,然後再從中讀取顯示在頁面上。下面我會貼出一些關鍵程式碼。 1.將圖片存入資料庫 前臺程式碼: <asp:FileUpload ID="FileUploadImage" runat="server" />後臺程式

python圖片轉base64存入redis讀取出來!

import redis import base64 #圖片轉文字 with open("/home/jd/Pictures/0.jpeg","rb") as f: # 開啟01.png圖片 # b64encode是編碼,b64decode是解碼

搞清Image加載事件(onload)、加載狀態(complete)後實現圖片的本地預覽自適應於父元素內

斷圖 idt ont election href this 出現 alpha ole onload與complete介紹 complete只是HTMLImageElement對象的一個屬性,可以判斷圖片加載完成,不管圖片是不是有緩存;而onload則是這個Image對象的

創建yum本地倉庫阿裏倉庫同步到本地定時更新

nal 成了 creat yum .com for 我們 extend sed 很多時候為了加速自己內部的rpm包安裝速度,都會搭建自己的yum源倉庫,而使用系統光盤自帶的源,由於軟件版本比較落後,所以不太適用,而大家都在用的阿裏倉庫比較好用,所以就想到了把阿裏倉庫的rpm

讀取圖片的最大值保存到txt文件

mes -m pil code path 文件類型 root nump 像素 功能介紹:從一個文件夾中讀取圖片,獲得圖片的像素最大值,並記錄在txt文件中保存,同時應保存對應的文件名。 特別說明:圖片文件為png格式,8bit的單層圖(即灰度圖),不確定此代碼是否適用於其他

文件拖曳到窗體上 獲取其完整路徑 【C++ Builder下實現】轉

pat ext stc fff led CP tle 聲明 net 1. 在窗體的頭文件.h裏聲明處理函數和消息映射, 如: [cpp] view plain copy class TForm1 : public TForm {

蘋果IOS 12使您的iPhone更安全有更強大的黑客保護

證明 正在 默認 的確 密鑰 充電狀態 軟件 one dea   一年一度的IOS刷新正在進行中,蘋果已經預覽了它,beta測試者已經安裝了它,當iPhone在9月份到貨時我們其他人應該獲得iOS12。雖然軟件3-D表情符號和屏幕時間限制等功能在軟件到貨時可能會受到很大關註

資料生成帶圖表的pdf下載

1 需求 在web開發中經常遇到一些報表資料的線上預覽和下載,在我之前一篇文章中說過幾種實現的方式,可以根據自己的需求採用合適自己的方案。 2 基本實現流程 我線上預覽和下載都是採用的pdf格式,其實就是考慮生成pdf的模板,然後向其中新增資料。但是,操作pdf比較死板,不靈活。於是考慮

把kafka資料從hbase遷移到hdfs按天載入到hive表(hbase與hadoop不同叢集)

需求:由於我們用的阿里雲Hbase,按儲存收費,現在需要把kafka的資料直接同步到自己搭建的hadoop叢集上,(kafka和hadoop叢集在同一個區域網),然後對接到hive表中去,表按每天做分割槽 一、首先檢視kafka最小偏移量(offset) /usr/local/kafka/bin/k

web 上讀取圖片轉化指定格式

一、 轉換為 base64 public static string ObtainBase64FromWeb(string domain, string path) { string url = "https://" + domain + path; System.Net.WebReq

給定一個非負整數 num反覆各個位上的數字相加直到結果一位數

示例: 輸入: 38 輸出: 2 解釋: 各位相加的過程為:3 + 8 = 11, 1 + 1 = 2。 由於2是一位數,所以返回 2。 進階: 你可以不使用迴圈或者遞迴,且在 O(1) 時間複雜度內解決這個問題嗎?   class Solution {  

【我要程式設計】Java技術手冊之根據圖片連結把圖片轉化為io流輸出到頁面上的方法

適用場景:A程式只能內網訪問,B程式可以外網訪問,只有B程式可以訪問A程式,使用者需要通過B程式訪問A程式的圖片資源。這是可以使用該方法。 @RequestMapping("/getImageByPath") public void getImageByTomcat(St

彙編基礎練習題2:編寫輸出子程式功能是AX中的數顯示輸出在主程式中驗證。

彙編基礎練習題2: 編寫輸出子程式,功能是將AX中的數顯示輸出,並在主程式中驗證。 編譯工具:Masm for Windows 整合實驗環境2012.5 (附帶一個工具下載地址https://download.csdn.net/download/qq_36931762/1082577

MySQL資料庫一列資料組合成一行以逗號分割

MySQL的資料庫的GROUP_CONCAT函式 這一列的資料是這樣的: 執行這段SQL: SELECT GROUP_CONCAT(CONCAT('\'',keyword,'\'')) FROM  sp_goodimgsinfo where  goodid='7