使用opencv

时间:2017-06-12 22:53:57

标签: image opencv image-processing amazon-s3 aws-lambda

仅供参考,我是OpenCV的新手。我正在创建一个AWS Lambda函数,它将利用OpenCV 2.4来调整我在S3中拥有的图像。当图像上传到我的源存储桶时,S3会生成一个启动Lambda函数的事件。 lambda函数成功调整图像大小,并将调整大小后的图像存储到目标存储桶,其对象关键字与原始图像相同。我有测试图像,用数码相机拍摄,有些用Android手机拍摄。我注意到的是,如果我手机中的图像是纵向拍摄的,则源存储桶中的图像方向正确,但目标存储桶中的调整大小版本方向不正确。以纵向拍摄的图像将转换为横向。调整图像大小时如何保持方向。以下是我正在使用的代码。

    public Object handleRequest(S3Event input, Context context) {

    OpenCV.loadLibrary();

    for (S3EventNotificationRecord record : input.getRecords()) {

        String bucketName = record.getS3().getBucket().getName();
        S3ObjectEntity entity = record.getS3().getObject();

        String objectKey = entity.getUrlDecodedKey();
        context.getLogger().log("ObjectKey: " + objectKey);
        String fileExtension = objectKey.substring(objectKey.lastIndexOf("."));
        context.getLogger().log("file extension: " + fileExtension);
        S3Object object = s3Client.getObject(new GetObjectRequest(bucketName, objectKey));
        InputStream objectData = object.getObjectContent();

        ObjectMetadata objectMetadata = object.getObjectMetadata();

        // Process the objectData stream.
        int nRead;
        byte[] data = new byte[16 * 1024];
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        try {
            while ((nRead = objectData.read(data, 0, data.length)) != -1) {
                buffer.write(data, 0, nRead);
            }

            byte[] bytes = buffer.toByteArray();

            Mat srcImage = Highgui.imdecode(new MatOfByte(bytes), Highgui.CV_LOAD_IMAGE_UNCHANGED);

            Mat resizedImage = new Mat();
            Imgproc.resize(srcImage, resizedImage, new Size(0,0), 0.1, 0.1, Imgproc.INTER_AREA);

            MatOfByte resizedMatOfByte = new MatOfByte();

            Highgui.imencode(fileExtension, resizedImage, resizedMatOfByte);

            byte[] bytesToWrite = resizedMatOfByte.toArray();
            ObjectMetadata meta = new ObjectMetadata();

            meta.setContentLength(bytesToWrite.length);
            meta.setContentType(objectMetadata.getContentType());

            PutObjectRequest putRequest = new PutObjectRequest(Configuration.MINIMIZED_ARTIFACT_BUCKET, objectKey, new ByteArrayInputStream(bytesToWrite), meta);
            s3Client.putObject(putRequest);
            objectData.close();

        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

    }

    return null;

}

0 个答案:

没有答案