참 이상하게도 OpenCV에서는 편리한 Mat 합성 코드를 제공하지 않는다.

그래서 어쩔 수 없이 만들어야 한다.

이에 따른 코드는 다음과 같다.

Opacity(Alpha channel)까지 적용하였다.

간단하게 구현한것으로 최적화가 필요하다.

 

import cv from 'opencv4nodejs'

const overlayImage = (src: cv.Mat, overlay: cv.Mat, location: cv.Point2) => {
	const srcData = src.getData();
	const overlayData = overlay.getData();

	for (let y = Math.max(location.y, 0); y < src.rows; ++y) {
		const fY = y - location.y;
		if (fY >= overlay.rows) break;

		for (let x = Math.max(location.x, 0); x < src.cols; ++x) {
			const fX = x - location.x;
			if (fX >= overlay.cols) break;

			const overlayPxIndex = fY * overlay.step + fX * overlay.channels;
			const opacity = overlayData[overlayPxIndex + 3] / 255;

			for (let c = 0; opacity > 0 && c < src.channels; ++c) {
				const srcIndex = y * src.step + x * src.channels + c;
				const overlayIndex = overlayPxIndex + c;

				const overlayPx = overlayData[overlayIndex];
				const srcPx = srcData[srcIndex];
				srcData[srcIndex] = srcPx * (1.0 - opacity) + overlayPx * opacity;
			}
		}
	}

	const res = new cv.Mat(srcData, src.rows, src.cols, cv.CV_8UC3);
	return res;
};

 

Node.js + OpenCV 설치방법

'Developments > OpenCV' 카테고리의 다른 글

이미지 특징점 찾기 SIFT, SURF의 대안 ORB  (0) 2018.08.26

+ Recent posts