簡體   English   中英

如何將 opencv mat 灰度圖像轉換為 pytorch 張量?

[英]How to convert opencv mat grayscale image to pytorch tensor?

我想將 cv::Mat class 轉換為 torch::Tensor class 並將它們放入 libtorch 的 CNN 模塊中進行預測。 我應該如何將 Mat class 轉換為張量 class? 我的 CNN 模塊是使用 mnist 訓練集生成的 pt 文件。 這個mnist訓練集的訓練圖像是單通道灰度圖像。 如果我要測試,它應該加載一個灰度圖,所以我想將單通道灰度圖轉換為張量。 我使用的語言是c++。

想法是將 memory 從 cv::Mat object 復制到 torch::Tensor object:

    cv::Mat img =cv::imread("path/to/file.png");
    cv::cvtColor(img,img,cv::COLOR_BGR2GRAY);
    torch::Tensor tensor = torch::empty({img.cols,img.rows},torch::TensorOptions().dtype(torch::kUInt8));
    memcpy(tensor.data<void>(),img.data,img.rows*img.cols);

謝謝您的幫助。 最后,我找到了解決方案。 之前,我對張量 class 了解不多。 張量有四個元素,分別是圖像的數量、高度、寬度和字節深度。

  std::string p1 = "D:";
  std::string p2;
  std::cin >> p2;
  std::string p3 = ".png";
  std::string path = p1 + p2 + p3;
  cv::Mat image = cv::imread(path,cv::IMREAD_GRAYSCALE);
  torch::Tensor img_tensor = torch::from_blob(image.data, { 1, image.rows, image.cols, 1 }, torch::kByte);
  img_tensor = img_tensor.permute({ 0, 3, 1, 2 });
  img_tensor = img_tensor.toType(torch::kFloat);
  img_tensor = img_tensor.div(255);
  auto a = net->predict(img_tensor);
  std::cout << a.argmax() << std::endl;

我使用這種組合將 openCV 圖像轉換為 libtorch 的張量。 我使用 libtorch-cxx11-abi-shared-with-deps-1.10.0+cu102 和 C++ STANDARD 14。

cv::Mat image = cv::imread("test.jpeg")// Any image to load...
cv::Mat input; // Conversion of image in to color format or any format [1].
cv::cvtColor(image, input,  cv::COLOR_RGBGRAY); 
//cv::cvtColor(image, input, cv::COLOR_BGR2RGB);    //or for color  
                               
std::cout << "Check image dimentions" <<std::endl;  // Check conversion
std::cout << "pixel dim x: "<<input.rows<< std::endl;
std::cout << "pixel dim x: "<<input.cols<< std::endl;
//Image to tensor conversion.
torch::Tensor tensor_image = torch::from_blob(input.data, {1, input.rows, input.cols, 3}, torch::kByte);
//Permute data structure to Tensor format.
tensor_image = tensor_image.permute({0, 3, 1, 2});
tensor_image = tensor_image.toType(torch::kFloat);
tensor_image = tensor_image.div(255);
//load to CUDA device if need...
tensor_image = tensor_image.to(torch::kCUDA);
std::cout<<"Img to Tensor converted!"<<std::endl;

[1] https://docs.opencv.org/3.4/d8/d01/group__imgproc__color__conversions.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM