#javascript #reactjs #canvas #image-segmentation
Вопрос:
У меня есть данные JSON, которые содержат такие данные, как bbox и данные сегментации. я могу использовать данные bbox для рисования окна, но я не знаю, как использовать данные сегментации для рисования маски сегментации на моем изображении. любая помощь или руководство будут высоко оценены. Я загрузил свой код и JSON ниже
Реагирующий код:
import React, { useRef, useEffect,useState } from 'react';
import './App.css'
import Boundingbox from "react-bounding-box"
import 'bootstrap/dist/css/bootstrap.min.css';
function App() {
const [data,setData]=useState([]);
const canvas = useRef();
let ctx = null;
// initialize the canvas context
useEffect(() => {
// dynamically assign the width and height to canvas
const canvasEle = canvas.current;
canvasEle.width = canvasEle.clientWidth;
canvasEle.height = canvasEle.clientHeight;
// get context of the canvas
ctx = canvasEle.getContext("2d");
}, []);
const drawRect = (info, style = {}) => {
const { x, y, w, h } = info;
const { borderColor = 'black', borderWidth = 1 } = style;
ctx.beginPath();
ctx.strokeStyle = borderColor;
ctx.lineWidth = borderWidth;
ctx.rect(x, y, w, h);
ctx.stroke();
}
const getData=()=>{
fetch('/test.json'
,{
headers : {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
}
)
.then(function(response){
console.log(response)
return response.json();
})
.then(function(myJson) {
console.log(myJson.annotations[0].bbox);
setData(myJson.annotations[1].bbox)
const x1 = myJson.annotations[2].bbox[0];
const y1 = myJson.annotations[2].bbox[1];
const w1= myJson.annotations[2].bbox[2];
const h1 = myJson.annotations[2].bbox[3];
const r1Info = { x:x1 , y:y1, w:w1, h:h1 };
const r1Style = { borderColor: 'red', borderWidth: 5 };
drawRect(r1Info, r1Style);
});
});
}
useEffect(()=>{
getData()
},[])
// draw rectangle
return (
<div className="App">
<canvas style={{height:"512px" ,width:"512px",backgroundImage:`url(${"https://karthiknbucket1.s3.ap-southeast-1.amazonaws.com/00000001.png"})`,
backgroundPosition:"center",backgroundSize:"100% 100%"
}}ref={canvas}></canvas>
</div>
);
}
export default App;
Мой JSON:
"annotations": [
{
"segmentation": [
[
354,
216.5,
359.5,
213,
361.5,
209,
360.5,
162,
362.5,
148,
353,
143.5,
348,
143.5,
346,
145.5,
338.5,
147,
338.5,
151,
341.5,
158,
340.5,
182,
342.5,
194,
342.5,
213,
345,
216.5,
354,
216.5
]
],
"iscrowd": 0,
"image_id": 0,
"category_id": 1,
"id": 0,
"bbox": [
338.5,
143.5,
24,
73
],
"area": 1394.5
},
Я действительно хочу знать, как использовать эти данные для построения маски сегментации на изображениях, поэтому, пожалуйста, укажите или помогите мне, как это сделать. как указано в приведенном выше коде, я могу нарисовать ограничительную рамку на своих изображениях, и я хочу добавить маску сегментации, пожалуйста, помогите мне
Комментарии:
1. Ну, во-первых,
getData()
это асинхронная функция. Я не могу вспомнить, можете ли вы передать асинхронную функцию для использования effect, но в противном случае вы захотите либо дождаться getdata, либо поместить все остальное в блок then2. @pandamakes я обновил свой код, пожалуйста, помогите мне, как использовать приведенные выше данные json для рисования маски сегментации
3. вы получаете какие-либо ошибки в консоли?
4. Кроме того, работает ли код на ванильном javascript?
5. подождите, я думаю, я, возможно, неправильно понял, чего вы пытаетесь достичь здесь. вы пытаетесь отобразить изображение вашу сегментацию с помощью
react-bounding-box
? если это так, возможно, вы неправильно используете компонент react. Судя по его документу , вы должны использовать<Boundingbox />
, а не напрямую через HTML canvas.