cocoa-xu / evision

Evision: An OpenCV-Erlang/Elixir binding
https://evision.app
Apache License 2.0
337 stars 22 forks source link

rewrite `Evision.Mat.update_roi/3` #150

Closed cocoa-xu closed 1 year ago

cocoa-xu commented 1 year ago

This PR should fix #149.

iex(1)> image_tensor = Evision.Mat.literal([[[2,2,2]], [[2,3,4]], [[4,5,6]]], :u8)
%Evision.Mat{
  channels: 1,
  dims: 3,
  type: {:u, 8},
  raw_type: 0,
  shape: {3, 1, 3},
  ref: #Reference<0.3295664936.570032148.167498>
}
iex(2)> image_2d = Evision.Mat.last_dim_as_channel(image_tensor)
%Evision.Mat{
  channels: 3,
  dims: 2,
  type: {:u, 8},
  raw_type: 16,
  shape: {3, 1, 3},
  ref: #Reference<0.3295664936.570032148.167499>
}
iex(3)> Evision.Mat.to_nx(image_2d)
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [2, 2, 2]
    ],
    [
      [2, 3, 4]
    ],
    [
      [4, 5, 6]
    ]
  ]
>
iex(4)> patch_tensor = Evision.Mat.literal([[[7,8]], [[9,10]]], :u8)
%Evision.Mat{
  channels: 1,
  dims: 3,
  type: {:u, 8},
  raw_type: 0,
  shape: {2, 1, 2},
  ref: #Reference<0.3295664936.570032148.167503>
}
iex(5)> patch_2d = Evision.Mat.last_dim_as_channel(patch_tensor)
%Evision.Mat{
  channels: 2,
  dims: 2,
  type: {:u, 8},
  raw_type: 8,
  shape: {2, 1, 2},
  ref: #Reference<0.3295664936.570032148.167504>
}
iex(6)> Evision.Mat.to_nx(patch_2d)
#Nx.Tensor<
  u8[2][1][2]
  Evision.Backend
  [
    [
      [7, 8]
    ],
    [
      [9, 10]
    ]
  ]
>
iex(7)> roi = [{0, 2}, {0, 1}, {1, 3}]
[{0, 2}, {0, 1}, {1, 3}]
iex(8)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_2d, roi, patch_2d))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [2, 7, 8]
    ],
    [
      [2, 9, 10]
    ],
    [
      [4, 5, 6]
    ]
  ]
>
iex(9)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_2d, roi, patch_tensor))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [2, 7, 8]
    ],
    [
      [2, 9, 10]
    ],
    [
      [4, 5, 6]
    ]
  ]
>
iex(10)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_tensor, roi, patch_2d))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [2, 7, 8]
    ],
    [
      [2, 9, 10]
    ],
    [
      [4, 5, 6]
    ]
  ]
>
iex(11)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_tensor, roi, patch_tensor))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [2, 7, 8]
    ],
    [
      [2, 9, 10]
    ],
    [
      [4, 5, 6]
    ]
  ]
>
iex(12)> roi = [{1, 3}, {0, 1}, {1, 3}]
[{1, 3}, {0, 1}, {1, 3}]
iex(13)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_2d, roi, patch_2d))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [2, 2, 2]
    ],
    [
      [2, 7, 8]
    ],
    [
      [4, 9, 10]
    ]
  ]
>
iex(14)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_2d, roi, patch_tensor))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [2, 2, 2]
    ],
    [
      [2, 7, 8]
    ],
    [
      [4, 9, 10]
    ]
  ]
>
iex(15)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_tensor, roi, patch_2d))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [2, 2, 2]
    ],
    [
      [2, 7, 8]
    ],
    [
      [4, 9, 10]
    ]
  ]
>
iex(16)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_tensor, roi, patch_tensor))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [2, 2, 2]
    ],
    [
      [2, 7, 8]
    ],
    [
      [4, 9, 10]
    ]
  ]
>
iex(17)> roi = [{1, 3}, {0, 1}, {0, 2}]
[{1, 3}, {0, 1}, {0, 2}]
iex(18)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_2d, roi, patch_2d))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [2, 2, 2]
    ],
    [
      [7, 8, 4]
    ],
    [
      [9, 10, 6]
    ]
  ]
>
iex(19)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_2d, roi, patch_tensor))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [2, 2, 2]
    ],
    [
      [7, 8, 4]
    ],
    [
      [9, 10, 6]
    ]
  ]
>
iex(20)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_tensor, roi, patch_2d))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [2, 2, 2]
    ],
    [
      [7, 8, 4]
    ],
    [
      [9, 10, 6]
    ]
  ]
>
iex(21)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_tensor, roi, patch_tensor))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [2, 2, 2]
    ],
    [
      [7, 8, 4]
    ],
    [
      [9, 10, 6]
    ]
  ]
>
iex(22)> roi = [{0, 2}, {0, 1}, {0, 2}]
[{0, 2}, {0, 1}, {0, 2}]
iex(23)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_2d, roi, patch_2d))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [7, 8, 2]
    ],
    [
      [9, 10, 4]
    ],
    [
      [4, 5, 6]
    ]
  ]
>
iex(24)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_2d, roi, patch_tensor))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [7, 8, 2]
    ],
    [
      [9, 10, 4]
    ],
    [
      [4, 5, 6]
    ]
  ]
>
iex(25)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_tensor, roi, patch_2d))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [7, 8, 2]
    ],
    [
      [9, 10, 4]
    ],
    [
      [4, 5, 6]
    ]
  ]
>
iex(26)> Evision.Mat.to_nx(Evision.Mat.update_roi(image_tensor, roi, patch_tensor))
#Nx.Tensor<
  u8[3][1][3]
  Evision.Backend
  [
    [
      [7, 8, 2]
    ],
    [
      [9, 10, 4]
    ],
    [
      [4, 5, 6]
    ]
  ]
>