最近正在学习利用Spark做图像的分类和检索实验,首先需要上传图像数据(保存在本地文件系统中)到HBase中,提取的图像特征是SIFT,借助OpenCV库提取,刚开始是写一个任务上传图片,然后再写一个任务提取HBase中图像的特征值,考虑到图片的序列化和反序列化会耗费大量的时间,且频繁的磁盘IO对时间消耗也很大,因此,将两个任务合并成一个任务处理,减少处理时间,同时实验过程中也遇到不少错误。
批量上传数据并提取SIFT特征
package com.fang.spark
import java.awt.image.{BufferedImage, DataBufferByte}
import java.io.ByteArrayInputStream
import javax.imageio.ImageIO
import org.apache.hadoop.hbase._
import org.apache.hadoop.hbase.client._
import org.apache.hadoop.hbase.util.Bytes
import org.apache.spark.{SparkConf, SparkContext}
import org.opencv.core.{Core, CvType, Mat, MatOfKeyPoint}
import org.opencv.features2d.{DescriptorExtractor, FeatureDetector}
/**
* Created by hadoop on 16-11-15.
* 批量上传数据到HBase表中,并计算sift值
* 表结构为:
* imagesTable:(image:imageBinary,sift)
* RowKey设计为:
*/
object HBaseUpLoadImages {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf()
.setAppName("HBaseUpLoadImages").
setMaster("local[4]").
set("spark.serializer",