참 이상하게도 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;
};
'Developments > OpenCV' 카테고리의 다른 글
이미지 특징점 찾기 SIFT, SURF의 대안 ORB (0) | 2018.08.26 |
---|