지난번 게시글에서 Google Vision API 키를 발급받는 법을 알아보았는데 이번 포스팅에서는 이 발급받는 API 키를 이용해서 코드로 이미지를 분석하는 방법을 알아보려고 한다.
혹시 아직 Google Vision API 키 발급을 받지 않았다면 아래 링크를 참고하여 발급받으면 된다!
Google Vision API 키 발급받기
발급받은 API 키는 프로젝트의 .env 파일에 아래와 같이 넣어주면된다. 만약 .env 파일이 없다면 프로젝트의 root 경로에 .env라는 파일을 하나 생성해주면 된다.

API 키도 넣어주었으니 아래의 코드를 주석과 함께 살펴보자.
import axios from "axios";
import dotenv from "dotenv";
dotenv.config();
// Google Vision API의 URL, 환경 변수(.env 파일)에서 API 키를 불러옴
const GOOGLE_VISION_API_URL = `https://vision.googleapis.com/v1/images:annotate?key=${process.env.GOOGLE_VISION_API_KEY}`;
//Google Vision API를 사용하여 이미지 분석을 수행하는 함수
export const analyzeImageWithVisionAPI = async (imageUrl) => {
try {
// 이미지 데이터를 가져오고, 이진 데이터(binary)로 변환
const response = await axios.get(imageUrl, { responseType: 'arraybuffer' });
const base64Image = Buffer.from(response.data, 'binary').toString('base64');
// Google Vision API에 요청할 payload 생성 (레이블 감지 요청)
const payload = {
requests: [
{
image: {
content: base64Image
},
features: [
{ type: "LABEL_DETECTION" }, // 레이블 감지 기능 사용
]
}
]
};
// Google Vision API로 이미지 분석 요청 전송
const apiResponse = await axios.post(GOOGLE_VISION_API_URL, payload, {
headers: {
"Content-Type": "application/json"
}
});
// API 응답에서 레이블 정보를 추출
const labels = apiResponse.data.responses[0].labelAnnotations || [];
// 레이블과 확률(score)을 결과로 반환
const results = labels.map(label => ({
text: label.description, // 레이블 설명
prob: label.score // 레이블 감지 확률
}));
// 분석 결과를 확률이 높은 순으로 정렬하여 반환
console.log("Google Vision API Response:", results);
return results.sort((a, b) => b.prob - a.prob);
} catch (error) {
// 오류 발생 시 콘솔에 로그 출력 후 null 반환
console.error("Failed to analyze image with Google Vision API:", error);
return null;
}
};
아래 코드는 위의 함수(analyzeImageWithVisionAPI) 사용 예시이므로 참고하기
이렇게 함수를 호출하면 이미지가 분석이 잘 될 것이다!
const roomAnalyses = (
await Promise.all(
// getRoomImageData 배열에 있는 각 이미지 데이터에 대해 비동기적으로 처리
getRoomImageData.map(async (imageData) => {
// Google Vision API를 사용하여 이미지 분석을 수행
return await analyzeImageWithVisionAPI(imageUrl);
})
)
// 분석 결과가 null이 아닌 경우만 필터링
).filter(result => result !== null);