Browse Source

!21619 [assistant][RGB2BGR]

Merge pull request !21619 from QingfengLi/rgb2bgr
tags/v1.5.0-rc1
i-robot Gitee 4 years ago
parent
commit
b7bf424ef0
2 changed files with 48 additions and 4 deletions
  1. +43
    -4
      mindspore/ccsrc/minddata/dataset/kernels/image/image_utils.cc
  2. +5
    -0
      mindspore/ccsrc/minddata/dataset/kernels/image/rgb_to_bgr_op.cc

+ 43
- 4
mindspore/ccsrc/minddata/dataset/kernels/image/image_utils.cc View File

@@ -1255,14 +1255,53 @@ Status RgbaToBgr(const std::shared_ptr<Tensor> &input, std::shared_ptr<Tensor> *

Status RgbToBgr(const std::shared_ptr<Tensor> &input, std::shared_ptr<Tensor> *output) {
try {
std::shared_ptr<CVTensor> input_cv = CVTensor::AsCVTensor(std::move(input));
auto input_type = input->type();
std::shared_ptr<CVTensor> input_cv = CVTensor::AsCVTensor(input);
if (!input_cv->mat().data) {
RETURN_STATUS_UNEXPECTED("RgbToBgr: load image failed.");
}
if (input_cv->Rank() != 3 || input_cv->shape()[2] != 3) {
RETURN_STATUS_UNEXPECTED("RgbToBgr: image shape is not <H,W,C> or channel is not 3.");
}
TensorShape out_shape = TensorShape({input_cv->shape()[0], input_cv->shape()[1], 3});

cv::Mat image = input_cv->mat().clone();
if (input_type == DataType::DE_FLOAT16 || input_type == DataType::DE_INT16 || input_type == DataType::DE_UINT16) {
for (int i = 0; i < input_cv->mat().rows; ++i) {
cv::Vec3s *p1 = input_cv->mat().ptr<cv::Vec3s>(i);
cv::Vec3s *p2 = image.ptr<cv::Vec3s>(i);
for (int j = 0; j < input_cv->mat().cols; ++j) {
p2[j][2] = p1[j][0];
p2[j][1] = p1[j][1];
p2[j][0] = p1[j][2];
}
}
} else if (input_type == DataType::DE_FLOAT32 || input_type == DataType::DE_INT32) {
for (int i = 0; i < input_cv->mat().rows; ++i) {
cv::Vec3f *p1 = input_cv->mat().ptr<cv::Vec3f>(i);
cv::Vec3f *p2 = image.ptr<cv::Vec3f>(i);
for (int j = 0; j < input_cv->mat().cols; ++j) {
p2[j][2] = p1[j][0];
p2[j][1] = p1[j][1];
p2[j][0] = p1[j][2];
}
}
} else if (input_type == DataType::DE_FLOAT64) {
for (int i = 0; i < input_cv->mat().rows; ++i) {
cv::Vec3d *p1 = input_cv->mat().ptr<cv::Vec3d>(i);
cv::Vec3d *p2 = image.ptr<cv::Vec3d>(i);
for (int j = 0; j < input_cv->mat().cols; ++j) {
p2[j][2] = p1[j][0];
p2[j][1] = p1[j][1];
p2[j][0] = p1[j][2];
}
}
} else {
cv::cvtColor(input_cv->mat(), image, cv::COLOR_RGB2BGR);
}

std::shared_ptr<CVTensor> output_cv;
RETURN_IF_NOT_OK(CVTensor::CreateEmpty(out_shape, input_cv->type(), &output_cv));
cv::cvtColor(input_cv->mat(), output_cv->mat(), static_cast<int>(cv::COLOR_RGB2BGR));
RETURN_IF_NOT_OK(CVTensor::CreateFromMat(image, input_cv->Rank(), &output_cv));
*output = std::static_pointer_cast<Tensor>(output_cv);
return Status::OK();
} catch (const cv::Exception &e) {


+ 5
- 0
mindspore/ccsrc/minddata/dataset/kernels/image/rgb_to_bgr_op.cc View File

@@ -25,6 +25,11 @@ namespace dataset {

Status RgbToBgrOp::Compute(const std::shared_ptr<Tensor> &input, std::shared_ptr<Tensor> *output) {
IO_CHECK(input, output);
auto input_type = input->type();
CHECK_FAIL_RETURN_UNEXPECTED(input_type != DataType::DE_UINT32 && input_type != DataType::DE_UINT64 &&
input_type != DataType::DE_INT64 && input_type != DataType::DE_STRING,
"RgbToBgr: unsupported data type as [uint32, int64, uint64, string].");

return RgbToBgr(input, output);
}



Loading…
Cancel
Save