我需要一個 0-1 矩陣,其中 1 表示存在皮膚,0 表示影像的其他部分。我正在使用 openCV Js 進行影像處理,但由于“skinArea”屬于 CV_8UC1 型別,它不能與 CV_8UC4 型別的“mat255”分開。我需要 CV_8UC4 型別的“Mat0_1”矩陣進行進一步計算。
let minRange = new cv.Mat(img.rows, img.cols, img.type(), [72,22, 37, 0]);
let maxRange = new cv.Mat(img.rows, img.cols, img.type(), [173, 235, 127, 255]);
cv.inRange(img, minRange, maxRange, skinArea);
let mat255 = new cv.Mat(img.rows, img.cols, cv.CV_8UC4,new cv.Scalar(255,255,255,0))
cv.divide(skinArea,mat255,Mat0_1);
uj5u.com熱心網友回復:
我們可以通過執行帶有引數的cvtColorCV_8UC1來從to轉換:cv.CV_8UC4cv.COLOR_GRAY2BGRA
cv.cvtColor(skinArea, skinAreaBinaryBgra, cv.COLOR_GRAY2BGRA);
每 4 個通道的前三個通道應用 BGR(灰度藍色=綠色=紅色)。
第 4 個通道是 alpha(透明)通道 - 轉換將所有 alpha 元素設定為 255(完全不透明)。
除了除以 255,我們可以使用cv.min(skinArea, ones, skinAreaBinary);(只是因為除法運算被認為是低效的)。
代碼示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello OpenCV.js</title>
</head>
<body>
<p id="status">OpenCV.js is loading...</p>
<div>
<div class="inputoutput">
<img id="imageSrc" alt="No Image" />
<div class="caption">imageSrc <input type="file" id="fileInput" name="file" /></div>
</div>
<div class="inputoutput">
<canvas id="canvasOutput" ></canvas>
<div class="caption">canvasOutput</div>
</div>
</div>
<script async src="opencv.js" type="text/javascript"></script>
<script type="text/javascript">
let imgElement = document.getElementById('imageSrc');
let inputElement = document.getElementById('fileInput');
inputElement.addEventListener('change', (e) => {
imgElement.src = URL.createObjectURL(e.target.files[0]);
}, false);
//Read image and execute the OpenCV code sample.
imgElement.onload = function () {
let img = cv.imread(imgElement);
let skinArea = new cv.Mat()
let skinAreaBinary = new cv.Mat()
let skinAreaBinaryBgra = new cv.Mat()
let skinAreaBinaryBgraShow = new cv.Mat()
let minRange = new cv.Mat(img.rows, img.cols, img.type(), [72,22, 37, 0]);
let maxRange = new cv.Mat(img.rows, img.cols, img.type(), [173, 235, 127, 255]);
cv.inRange(img, minRange, maxRange, skinArea);
//let mat255 = new cv.Mat(img.rows, img.cols, cv.CV_8UC4,new cv.Scalar(255,255,255,0))
//cv.divide(skinArea,mat255,Mat0_1);
let ones = new cv.Mat(img.rows, img.cols, cv.CV_8UC1, new cv.Scalar(1)); //Matrix of ones
cv.min(skinArea, ones, skinAreaBinary); //min(val, 1) is more efficient than dividing by 255.
cv.cvtColor(skinArea, skinAreaBinaryBgra, cv.COLOR_GRAY2BGRA); //Convert to 4 channels (BGRA pixel format).
skinAreaBinaryBgra.convertTo(skinAreaBinaryBgraShow, cv.CV_8U, 255.0); //Scale by 255 before displaying (for testing).
cv.imshow('canvasOutput', skinAreaBinaryBgraShow); //Show result for testing
};
//check openCV
var Module = {
// https://emscripten.org/docs/api_reference/module.html#Module.onRuntimeInitialized
onRuntimeInitialized() {
document.getElementById('status').innerHTML = 'OpenCV.js is ready.';
}
};
</script>
</body>
</html>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/511623.html
下一篇:如何找到影像中不同邊緣的角度
