нарисуйте маску сегментации с помощью ReactJS

#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, либо поместить все остальное в блок then

2. @pandamakes я обновил свой код, пожалуйста, помогите мне, как использовать приведенные выше данные json для рисования маски сегментации

3. вы получаете какие-либо ошибки в консоли?

4. Кроме того, работает ли код на ванильном javascript?

5. подождите, я думаю, я, возможно, неправильно понял, чего вы пытаетесь достичь здесь. вы пытаетесь отобразить изображение вашу сегментацию с помощью react-bounding-box ? если это так, возможно, вы неправильно используете компонент react. Судя по его документу , вы должны использовать <Boundingbox /> , а не напрямую через HTML canvas.