如何修复opencv.js在使用cv.threshold时抛出随机数。

huangapple go评论128阅读模式
英文:

How to fix opencv.js throwing random number when using cv.threshold

问题

当我选择图像并调用cv.threshold时,它会抛出奇怪的数字

> 6620912

有时数字会改变

如何修复opencv.js在使用cv.threshold时抛出随机数。

  1. Promise.catch (async)
  2. (anonymous) @ App.tsx:49
  3. commitHookEffectListMount @ react-dom_client.js?v=a95a0b27:16902
  4. commitPassiveMountOnFiber @ react-dom_client.js?v=a95a0b27:18150
  5. commitPassiveMountEffects_complete @ react-dom_client.js?v=a95a0b27:18123
  6. commitPassiveMountEffects_begin @ react-dom_client.js?v=a95a0b27:18113
  7. commitPassiveMountEffects @ react-dom_client.js?v=a95a0b27:18103
  8. flushPassiveEffectsImpl @ react-dom_client.js?v=a95a0b27:19484
  9. flushPassiveEffects @ react-dom_client.js?v=a95a0b27:19441
  10. commitRootImpl @ react-dom_client.js?v=a95a0b27:19410
  11. commitRoot @ react-dom_client.js?v=a95a0b27:19271
  12. performSyncWorkOnRoot @ react-dom_client.js?v=a95a0b27:18889
  13. flushSyncCallbacks @ react-dom_client.js?v=a95a0b27:9133
  14. flushSync @ react-dom_client.js?v=a95a0b27:18953
  15. finishEventHandler @ react-dom_client.js?v=a95a0b27:3567
  16. batchedUpdates @ react-dom_client.js?v=a95a0b27:3580
  17. dispatchEventForPluginEventSystem @ react-dom_client.js?v=a95a0b27:7174
  18. dispatchEventWithEnableCapturePhaseSelectiveHydrationWithoutDiscreteEventReplay @ react-dom_client.js?v=a95a0b27:5476
  19. dispatchEvent @ react-dom_client.js?v=a95a0b27:5470
  20. dispatchDiscreteEvent @ react-dom_client.js?v=a95a0b27:5447

StackBlitz

  1. import { FC, useEffect, useRef, useState } from 'react'
  2. declare const cv: any
  3. const Canvas = (width: number, height: number) => {
  4. const canvas = document.createElement('canvas')
  5. canvas.width = width
  6. canvas.height = height
  7. return canvas
  8. }
  9. const App: FC = () => {
  10. const [OriginalImage, SetOriginalImage] = useState<string>('')
  11. const PreviewCanvasRef = useRef<HTMLCanvasElement>(null)
  12. useEffect(() => {
  13. if (!OriginalImage) return
  14. const asyncWrapper = async () => {
  15. if (!PreviewCanvasRef.current) return
  16. const image = await new Promise<HTMLImageElement>(resolve => {
  17. const img = new Image()
  18. img.onload = () => resolve(img)
  19. img.src = OriginalImage
  20. })
  21. const canvas = Canvas(image.width, image.height)
  22. const ctx = canvas.getContext('2d')
  23. ctx?.drawImage(image, 0, 0)
  24. const rawImage = cv.imread(canvas)
  25. const tresholdImage = new cv.Mat()
  26. cv.threshold(rawImage, tresholdImage, 0, 255, cv.THRESH_OTSU)
  27. cv.imshow(PreviewCanvasRef.current, tresholdImage)
  28. rawImage.delete()
  29. tresholdImage.delete()
  30. }
  31. asyncWrapper().catch(console.error)
  32. }, [OriginalImage])
  33. return (
  34. <div>
  35. <input
  36. type='file'
  37. name='file'
  38. accept='image/*'
  39. onChange={event => {
  40. SetOriginalImage(prev => {
  41. if (!event.target.files?.[0]) return prev
  42. if (prev) URL.revokeObjectURL(prev)
  43. return URL.createObjectURL(event.target.files[0])
  44. })
  45. }}
  46. />
  47. <img alt='Original input' src={OriginalImage} />
  48. <canvas ref={PreviewCanvasRef} />
  49. </div>
  50. )
  51. }
  52. export default App
英文:

When I select image and cv.threshold is called it throws weird number

> 6620912

Sometimes the number changes

如何修复opencv.js在使用cv.threshold时抛出随机数。

  1. 6620912
  2. Promise.catch (async)
  3. (anonymous) @ App.tsx:49
  4. commitHookEffectListMount @ react-dom_client.js?v=a95a0b27:16902
  5. commitPassiveMountOnFiber @ react-dom_client.js?v=a95a0b27:18150
  6. commitPassiveMountEffects_complete @ react-dom_client.js?v=a95a0b27:18123
  7. commitPassiveMountEffects_begin @ react-dom_client.js?v=a95a0b27:18113
  8. commitPassiveMountEffects @ react-dom_client.js?v=a95a0b27:18103
  9. flushPassiveEffectsImpl @ react-dom_client.js?v=a95a0b27:19484
  10. flushPassiveEffects @ react-dom_client.js?v=a95a0b27:19441
  11. commitRootImpl @ react-dom_client.js?v=a95a0b27:19410
  12. commitRoot @ react-dom_client.js?v=a95a0b27:19271
  13. performSyncWorkOnRoot @ react-dom_client.js?v=a95a0b27:18889
  14. flushSyncCallbacks @ react-dom_client.js?v=a95a0b27:9133
  15. flushSync @ react-dom_client.js?v=a95a0b27:18953
  16. finishEventHandler @ react-dom_client.js?v=a95a0b27:3567
  17. batchedUpdates @ react-dom_client.js?v=a95a0b27:3580
  18. dispatchEventForPluginEventSystem @ react-dom_client.js?v=a95a0b27:7174
  19. dispatchEventWithEnableCapturePhaseSelectiveHydrationWithoutDiscreteEventReplay @ react-dom_client.js?v=a95a0b27:5476
  20. dispatchEvent @ react-dom_client.js?v=a95a0b27:5470
  21. dispatchDiscreteEvent @ react-dom_client.js?v=a95a0b27:5447

StackBlitz

  1. import { FC, useEffect, useRef, useState } from &#39;react&#39;
  2. declare const cv: any
  3. const Canvas = (width: number, height: number) =&gt; {
  4. const canvas = document.createElement(&#39;canvas&#39;)
  5. canvas.width = width
  6. canvas.height = height
  7. return canvas
  8. }
  9. const App: FC = () =&gt; {
  10. const [OriginalImage, SetOriginalImage] = useState&lt;string&gt;(&#39;&#39;)
  11. const PreviewCanvasRef = useRef&lt;HTMLCanvasElement&gt;(null)
  12. useEffect(() =&gt; {
  13. if (!OriginalImage) return
  14. const asyncWrapper = async () =&gt; {
  15. if (!PreviewCanvasRef.current) return
  16. const image = await new Promise&lt;HTMLImageElement&gt;(resolve =&gt; {
  17. const img = new Image()
  18. img.onload = () =&gt; resolve(img)
  19. img.src = OriginalImage
  20. })
  21. const canvas = Canvas(image.width, image.height)
  22. const ctx = canvas.getContext(&#39;2d&#39;)
  23. ctx?.drawImage(image, 0, 0)
  24. const rawImage = cv.imread(canvas)
  25. const tresholdImage = new cv.Mat()
  26. cv.threshold(rawImage, tresholdImage, 0, 255, cv.THRESH_OTSU)
  27. cv.imshow(PreviewCanvasRef.current, tresholdImage)
  28. rawImage.delete()
  29. tresholdImage.delete()
  30. }
  31. asyncWrapper().catch(console.error)
  32. }, [OriginalImage])
  33. return (
  34. &lt;div&gt;
  35. &lt;input
  36. type=&#39;file&#39;
  37. name=&#39;file&#39;
  38. accept=&#39;image/*&#39;
  39. onChange={event =&gt; {
  40. SetOriginalImage(prev =&gt; {
  41. if (!event.target.files?.[0]) return prev
  42. if (prev) URL.revokeObjectURL(prev)
  43. return URL.createObjectURL(event.target.files[0])
  44. })
  45. }}
  46. /&gt;
  47. &lt;img alt=&#39;Original input&#39; src={OriginalImage} /&gt;
  48. &lt;canvas ref={PreviewCanvasRef} /&gt;
  49. &lt;/div&gt;
  50. )
  51. }
  52. export default App

答案1

得分: 0

为了修复这个问题,我需要首先将图像转为灰度。

  1. const grayscaleImage = new cv.Mat()
  2. cv.cvtColor(rawImage, grayscaleImage, cv.COLOR_RGBA2GRAY, 0)

然后将grayscaleImage用作threshold的输入。

英文:

To fix this I need to grayscale the image first

  1. const grayscaleImage = new cv.Mat()
  2. cv.cvtColor(rawImage, grayscaleImage, cv.COLOR_RGBA2GRAY, 0)

And use the grayscaleImage as input for threshold

huangapple
  • 本文由 发表于 2023年6月18日 23:18:43
  • 转载请务必保留本文链接:https://go.coder-hub.com/76501224.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定