簡介: 在阿里云Serverless函式計算服務中部署普通圖片轉素描圖函式服務,實作將批量上傳到指定OSS桶內的圖片自動轉換為素描圖并保存到另一個OSS桶內
場景介紹
小明接到學校老師安排的任務,需要批量將班級里同學們拍的普通照片轉換為素描圖,供課堂游戲使用,于是求助到程式員老爸,機智的程式員老爸分分鐘用幾行Python代碼解決:在阿里云Serverless函式計算服務中部署普通圖片轉素描圖函式服務,實作將批量上傳到指定OSS桶內的圖片自動轉換為素描圖并保存到另一個OSS桶內,

目標讀者
了解阿里云Serverless、OSS、FC產品,有一定的云計算實踐經驗及Python編程經驗,熟悉阿里云鑒權系統及圖片處理OpenCV庫的個人開發者,
相關概念
Serverless:全稱Serverless computing,既無服務器計算,是云計算的一種新模式,區別于傳統的IaaS、PaaS、SaaS,無服務器運算不代表它真的不需要服務,而是指普通開發者不用過多考慮服務器、app運行環境及各種周邊依賴問題,計算資源真正成為一種服務而不是服務器或者容器,它允許開發者在以管理某個具體功能函式的粒度進行部署及運維管理,以便讓開發者專注于核心業務邏輯,更快速地開發應用,
Function Compute:前面講的Serverless是一種抽象層次更高說法,“FaaS + BaaS”是Serverless架構模式的一種實作,阿里云Function Compute就是典型的FaaS,配合阿里云豐富的BaaS(SLS、OSS、RDS等)服務,可以非常快速的部署應用,FC是一種基于事件驅動的全托管計算服務,用戶無需采購與管理服務器等基礎設施,只需撰寫并上傳代碼,FC使用計算、存盤資源,彈性地、可靠地運行任務,并提供日志查詢、性能監控和報警等功能,
前提條件/環境準備
1.已開通阿里云FC、OSS、SLS服務
2.提前準備好普通圖片轉換為素描圖的Python代碼
3.提前準備好測驗圖片
4.提前創建好兩個測驗用的OSS桶(不能將轉換后的圖片上傳到同一個OSS bucket中,這會導致函式被無限回圈執行)

操作步驟
步驟一:創建函式計算FC服務
-
選擇函式及服務點擊“創建服務”,填寫名稱和描述:

-
進入函式管理,點擊“創建函式”:

運行環境選擇Python 3.6,代碼上傳方式選擇使用示例代碼,請求處理程式型別選擇處理事件請求

觸發器選擇OSS,Bucket選擇提前創建好的sketch-image-input,檔案后綴為.jpg,防止其他型別的檔案上傳后誤觸發函式執行

授權角色


-
測驗默認提供的Python函式,熟悉下基本功能:

步驟二:撰寫Python腳本,實作普通圖片轉換為素描圖函式
- 在編輯器中,輸入提前寫好的Python代碼:

參考代碼如下:
# -*- coding: utf-8 -*-
import cv2
import json
import logging
import oss2
def sketch_image(source_image, target_image):
# read image
image = cv2.imread(source_image)
# sketch image
grey_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
invert_image = cv2.bitwise_not(grey_image)
gaussian_blur_image = cv2.GaussianBlur(invert_image, (7, 7), 0)
inverse_image = cv2.bitwise_not(gaussian_blur_image)
sketch_image_result = cv2.divide(grey_image, inverse_image, scale=256.0)
# save image
cv2.imwrite(target_image, sketch_image_result)
cv2.waitKey(0)
cv2.destroyAllWindows()
def handler(event, context):
logger = logging.getLogger()
evt = json.loads(event)
creds = context.credentials
# Required by OSS sdk
auth=oss2.StsAuth(
creds.access_key_id,
creds.access_key_secret,
creds.security_token)
evt = evt['events'][0]
bucket_name = evt['oss']['bucket']['name']
endpoint = 'oss-' + evt['region'] + '.aliyuncs.com'
bucket_input = oss2.Bucket(auth, endpoint, bucket_name)
bucket_output = oss2.Bucket(auth, endpoint, 'sketch-image-ouput')
logger.info('oss endpoint: %s' % endpoint)
objectName = evt['oss']['object']['key']
logger.info('oss objectName: %s' % objectName)
newKey = 'sketch_' + objectName
# Download image
source_image = '/tmp/%s' % objectName
bucket_input.get_object_to_file(objectName, source_image)
logger.info('download image %s success.' % source_image)
# Sketch image
target_image = '/tmp/%s' % newKey
sketch_image(source_image, target_image)
# Upload image
with open(target_image, 'rb') as fileobj:
bucket_output.put_object(newKey, fileobj)
logger.info('upload image %s success.' % newKey)
函式撰寫程序中,參考了阿里云提供的SDK案例,內容非常豐富,想要的功能都有,且FC提供的Python運行環境內置oss、OpenCV等常用模塊,很好的支撐普通開發者快速實作功能,點贊????:
FC使用OSS觸發器SDK:https://help.aliyun.com/document_detail/74765.html
OSS檔案下載、上傳SDK:https://help.aliyun.com/document_detail/88426.html
FC Python環境內置模塊:https://help.aliyun.com/document_detail/158208.html
- 部署代碼并開通SLS日志服務,便于除錯代碼時查看日志,真的很方便??:


方案驗證
1.上傳本地測驗圖片到OSS sketch-image-input桶中:


2.觀察函式sketch_image呼叫日志資訊及監控資訊:


3.查看OSS sketch-image-output桶內轉換后的素描圖,效果還不錯??:

4.批量上傳圖片測驗,函式功能很穩定????:

更多內容關注 Serverless 微信公眾號(ID:serverlessdevs),匯集 Serverless 技術最全內容,定期舉辦 Serverless 活動、直播,用戶最佳實踐,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/502649.html
標籤:其他
