1
1
import React , { useState , useRef , useEffect } from "react" ;
2
- import styles from "./../styles/Viewer.module.css"
2
+ import styles from "./../styles/Viewer.module.css" ;
3
3
import Overlay from "./Overlay" ;
4
- import { Camera } from "react-camera-pro" ;
4
+ import { Camera } from "react-camera-pro" ;
5
+ import classifyImage from "./ML" ;
5
6
6
7
const Viewer = ( props ) => {
7
8
const camera = useRef ( null ) ;
8
- const [ numberOfCameras , setNumberOfCameras ] = useState ( 0 ) ;
9
+ const [ numberOfCameras , setNumberOfCameras ] = useState ( 0 ) ;
9
10
const [ image , setImage ] = useState ( null ) ;
10
- const [ scanning , setScanning ] = useState ( false ) ;
11
- const [ loading , setLoading ] = useState ( false ) ;
12
- const [ recyclable , setRecyclable ] = useState ( false ) ;
13
- const [ next , setNext ] = useState ( false ) ;
14
- const [ plastic , setPlastic ] = useState ( 1 ) ;
15
- const inputRef = useRef ( null ) ;
16
- const canvas = useRef ( null ) ;
17
- const [ backImage , setBackImage ] = useState ( null ) ;
11
+ const [ scanning , setScanning ] = useState ( false ) ;
12
+ const [ loading , setLoading ] = useState ( false ) ;
13
+ const [ recyclable , setRecyclable ] = useState ( false ) ;
14
+ const [ next , setNext ] = useState ( false ) ;
15
+ const [ plastic , setPlastic ] = useState ( 1 ) ;
16
+ const inputRef = useRef ( null ) ;
17
+ const canvas = useRef ( null ) ;
18
+ const [ backImage , setBackImage ] = useState ( null ) ;
18
19
19
- const handleUploadClick = ( ) => {
20
+ const handleUploadClick = ( ) => {
20
21
inputRef . current ?. click ( ) ;
21
22
} ;
22
23
23
- const handleReturn = ( ) => {
24
- setScanning ( false ) ;
25
- setLoading ( false ) ;
26
- setNext ( false ) ;
27
- }
24
+ const handleReturn = ( ) => {
25
+ setScanning ( false ) ;
26
+ setLoading ( false ) ;
27
+ setNext ( false ) ;
28
+ } ;
28
29
29
- const fetchData = async ( ) => {
30
- try {
31
- const res = await fetch ( "/api/ml" , {
32
- method : 'POST' ,
33
- headers : {
34
- 'Accept' : 'application/json' ,
35
- 'Content-Type' : 'application/json'
36
- } ,
37
- body : JSON . stringify ( { image :image } )
38
- } ) ;
39
- const data = await res . json ( ) ;
40
- return data ;
41
- } catch ( err ) {
42
- console . log ( err ) ;
43
- }
44
- }
30
+ const fetchData = async ( ) => {
31
+ /*
32
+ try {
33
+ const res = await fetch("/api/ml", {
34
+ method: "POST",
35
+ headers: {
36
+ Accept: "application/json",
37
+ "Content-Type": "application/json",
38
+ },
39
+ body: JSON.stringify({ image: image }),
40
+ });
41
+ const data = await res.json();
42
+ return data;
43
+ } catch (err) {
44
+ console.log(err);
45
+ }
46
+ */
47
+ return classifyImage ( image ) ;
48
+ } ;
45
49
46
- useEffect ( ( ) => {
47
- const run = async ( ) => {
48
- const data = await fetchData ( ) ;
49
- props . setTensor ( data . tensor ) ;
50
- props . setPred ( parseInt ( data . number ) )
51
- setPlastic ( data . number ) ;
52
- if ( plastic === 1 || plastic === 2 || plastic === 5 ) {
53
- setRecyclable ( true ) ;
54
- } else {
55
- setRecyclable ( false ) ;
56
- }
57
- setLoading ( false ) ;
58
- setNext ( true ) ;
59
- }
60
- if ( image ) {
61
- scan ( )
62
- run ( ) ;
63
- }
64
- } , [ image ] ) ;
50
+ useEffect ( ( ) => {
51
+ const run = async ( ) => {
52
+ const data = await fetchData ( ) ;
53
+ props . setTensor ( data . tensor ) ;
54
+ props . setPred ( parseInt ( data . number ) ) ;
55
+ setPlastic ( data . number ) ;
56
+ if ( plastic === 1 || plastic === 2 || plastic === 5 ) {
57
+ setRecyclable ( true ) ;
58
+ } else {
59
+ setRecyclable ( false ) ;
60
+ }
61
+ setLoading ( false ) ;
62
+ setNext ( true ) ;
63
+ } ;
64
+ if ( image ) {
65
+ scan ( ) ;
66
+ run ( ) ;
67
+ }
68
+ } , [ image ] ) ;
65
69
66
- function cropImage ( img ) {
67
- setBackImage ( img )
70
+ function cropImage ( img ) {
71
+ setBackImage ( img ) ;
68
72
const originalImage = new Image ( ) ;
69
- originalImage . src = img ;
73
+ originalImage . src = img ;
70
74
const ctx = canvas . current . getContext ( "2d" ) ;
71
-
72
- originalImage . addEventListener ( ' load' , function ( ) {
73
- const originalWidth = originalImage . naturalWidth ;
74
- const originalHeight = originalImage . naturalHeight ;
75
- const aspectRatio = originalWidth / originalHeight ;
76
- let newHeight = Math . floor ( 224 / aspectRatio ) ;
77
- let y = ( newHeight / 2 ) - 112 ;
78
-
79
- canvas . width = 224 ;
80
- canvas . height = 224 ;
81
-
82
- ctx . drawImage ( originalImage , 0 , - y , 224 , newHeight ) ;
83
- setImage ( canvas . current . toDataURL ( "image/jpeg" ) ) ;
75
+
76
+ originalImage . addEventListener ( " load" , function ( ) {
77
+ const originalWidth = originalImage . naturalWidth ;
78
+ const originalHeight = originalImage . naturalHeight ;
79
+ const aspectRatio = originalWidth / originalHeight ;
80
+ let newHeight = Math . floor ( 224 / aspectRatio ) ;
81
+ let y = newHeight / 2 - 112 ;
82
+
83
+ canvas . width = 224 ;
84
+ canvas . height = 224 ;
85
+
86
+ ctx . drawImage ( originalImage , 0 , - y , 224 , newHeight ) ;
87
+ setImage ( canvas . current . toDataURL ( "image/jpeg" ) ) ;
84
88
} ) ;
85
- }
89
+ }
86
90
87
- const handleFileChange = ( event ) => {
91
+ const handleFileChange = ( event ) => {
88
92
if ( ! event . target . files ) {
89
93
return ;
90
94
}
91
- var reader = new FileReader ( ) ;
92
- reader . readAsDataURL ( event . target . files [ 0 ] ) ;
93
- reader . onloadend = function ( ) {
94
- var base64data = reader . result ;
95
- cropImage ( base64data ) ;
96
- }
95
+ var reader = new FileReader ( ) ;
96
+ reader . readAsDataURL ( event . target . files [ 0 ] ) ;
97
+ reader . onloadend = function ( ) {
98
+ var base64data = reader . result ;
99
+ cropImage ( base64data ) ;
100
+ } ;
97
101
} ;
98
102
99
- const scan = ( ) => {
100
- setScanning ( true ) ;
101
- setLoading ( true ) ;
102
- }
103
+ const scan = ( ) => {
104
+ setScanning ( true ) ;
105
+ setLoading ( true ) ;
106
+ } ;
103
107
104
- const takePhoto = async ( ) => {
105
- const photo = camera . current . takePhoto ( ) ;
106
- cropImage ( photo ) ;
107
- }
108
+ const takePhoto = async ( ) => {
109
+ const photo = camera . current . takePhoto ( ) ;
110
+ cropImage ( photo ) ;
111
+ } ;
108
112
109
113
return (
110
- < div className = { styles . camera } >
111
- < canvas className = { styles . canvas } width = { 224 } height = { 224 } ref = { canvas } > </ canvas >
112
- { ! next &&
113
- < img src = "example.svg" className = { styles . example } />
114
- }
115
- { ! next &&
116
- < div className = { styles . title } > Scan</ div >
117
- }
118
- { scanning &&
119
- < img className = { styles . preview } src = { backImage } />
120
- }
121
- < img className = { styles . goback } src = "close.svg" onClick = { ( ) => props . setView ( false ) } />
122
- < div className = { styles . overlay } > </ div >
123
- {
124
- loading &&
125
- < div className = { styles . scanline } > </ div >
126
- }
127
- { ! next &&
128
- < img className = { styles . scanarea } src = "scanarea.svg" />
129
- }
130
- { ! scanning &&
131
- < Camera ref = { camera } numberOfCamerasCallback = { setNumberOfCameras } facingMode = 'environment' />
132
- }
133
- < img src = { image } alt = 'Image preview' className = { styles . image } />
134
- { ! scanning &&
135
- < button
136
- className = { styles . takephoto }
137
- onClick = { takePhoto }
138
- >
139
- < img src = "cam.svg" />
140
- </ button >
141
- }
142
- { ! scanning &&
143
- < button
144
- className = { styles . switchcamera }
145
- hidden = { numberOfCameras <= 1 }
146
- onClick = { ( ) => {
147
- camera . current . switchCamera ( ) ;
148
- } }
149
- >
150
- < img src = "rotate.svg" />
151
- </ button >
152
- }
153
- { ! scanning &&
154
- < img src = "upload.svg" className = { styles . upload } onClick = { handleUploadClick } />
155
- }
156
- < Overlay pred = { props . pred } setPred = { props . setPred } tensor = { props . tensor } setTensor = { props . setTensor } setNum = { props . setNum } num = { props . num } loading = { loading } region = { props . region } setPlastic = { setPlastic } setRecyclable = { setRecyclable } scanning = { scanning } ready = { next } plastic = { plastic } recyclable = { recyclable } handleReturn = { handleReturn } />
157
- < input
114
+ < div className = { styles . camera } >
115
+ < canvas
116
+ className = { styles . canvas }
117
+ width = { 224 }
118
+ height = { 224 }
119
+ ref = { canvas }
120
+ > </ canvas >
121
+ { ! next && < img src = "example.svg" className = { styles . example } /> }
122
+ { ! next && < div className = { styles . title } > Scan</ div > }
123
+ { scanning && < img className = { styles . preview } src = { backImage } /> }
124
+ < img
125
+ className = { styles . goback }
126
+ src = "close.svg"
127
+ onClick = { ( ) => props . setView ( false ) }
128
+ />
129
+ < div className = { styles . overlay } > </ div >
130
+ { loading && < div className = { styles . scanline } > </ div > }
131
+ { ! next && < img className = { styles . scanarea } src = "scanarea.svg" /> }
132
+ { ! scanning && (
133
+ < Camera
134
+ ref = { camera }
135
+ numberOfCamerasCallback = { setNumberOfCameras }
136
+ facingMode = "environment"
137
+ />
138
+ ) }
139
+ < img src = { image } alt = "Image preview" className = { styles . image } />
140
+ { ! scanning && (
141
+ < button className = { styles . takephoto } onClick = { takePhoto } >
142
+ < img src = "cam.svg" />
143
+ </ button >
144
+ ) }
145
+ { ! scanning && (
146
+ < button
147
+ className = { styles . switchcamera }
148
+ hidden = { numberOfCameras <= 1 }
149
+ onClick = { ( ) => {
150
+ camera . current . switchCamera ( ) ;
151
+ } }
152
+ >
153
+ < img src = "rotate.svg" />
154
+ </ button >
155
+ ) }
156
+ { ! scanning && (
157
+ < img
158
+ src = "upload.svg"
159
+ className = { styles . upload }
160
+ onClick = { handleUploadClick }
161
+ />
162
+ ) }
163
+ < Overlay
164
+ pred = { props . pred }
165
+ setPred = { props . setPred }
166
+ tensor = { props . tensor }
167
+ setTensor = { props . setTensor }
168
+ setNum = { props . setNum }
169
+ num = { props . num }
170
+ loading = { loading }
171
+ region = { props . region }
172
+ setPlastic = { setPlastic }
173
+ setRecyclable = { setRecyclable }
174
+ scanning = { scanning }
175
+ ready = { next }
176
+ plastic = { plastic }
177
+ recyclable = { recyclable }
178
+ handleReturn = { handleReturn }
179
+ />
180
+ < input
158
181
type = "file"
159
182
ref = { inputRef }
160
183
onChange = { handleFileChange }
161
- style = { { display : ' none' } }
184
+ style = { { display : " none" } }
162
185
/>
163
- </ div >
164
- )
165
- }
186
+ </ div >
187
+ ) ;
188
+ } ;
166
189
167
- export default Viewer ;
190
+ export default Viewer ;
0 commit comments