給定:
以下代碼片段:
#include <opencv2/core.hpp>
#include <iostream>
int
main(int argc, char** argv)
{
cv::Mat a = (cv::Mat_<double>(3,1) << 1, 2, 3);
cv::Mat b;
std::cout << "a(before): " << cv::typeToString(a.type()) << std::endl;
std::cout << "b(before): " << cv::typeToString(b.type()) << std::endl;
std::cout << std::endl;
std::cout << "Convert 'a' --> 'b' with type CV_64FC4" << std::endl;
std::cout << std::endl;
a.convertTo(b, CV_64FC4);
std::cout << "a(after): " << cv::typeToString(a.type()) << std::endl;
std::cout << "b(after): " << cv::typeToString(b.type()) << std::endl;
return 0;
}
期待:
據我了解,應該產生以下輸出:
a(before): CV_64FC1
b(before): CV_8UC1
Convert 'a' --> 'b' with type CV_64FC4
a(after): CV_64FC1
b(after): CV_64FC4
輸出:
相反,輸出如下:
a(before): CV_64FC1
b(before): CV_8UC1
Convert 'a' --> 'b' with type CV_64FC4
a(after): CV_64FC1
b(after): CV_64FC1
問題:
這里發生了什么?我如何才能真正轉換為指定的目標型別?
uj5u.com熱心網友回復:
簡短回答:
cv::Mat::convertTo不支持更改頻道數。
更長的答案:
正如您在有關(您傳遞給的那個)引數的檔案中看到的那樣:rtypecv::Mat::convertToCV_64FC4
所需的輸出矩陣型別,或者更確切地說,由于通道數與輸入具有相同的深度;如果 rtype 為負數,則輸出矩陣將與輸入具有相同的型別。
即convertTo不處理改變通道數的情況(只有每個通道的位深度)。
盡管沒有明確記錄,但我猜想cv::Mat::convertTo從中提取位深度rtype并忽略通道數。
在您的示例中: a具有單個通道,因此b在轉換后也是如此。
為了看到效果convertTo,可以通過 egCV_32FC1將 64 位轉換double為 32 位float。
更新:
根據 OP 的要求(在下面的評論中),以下是使用更改頻道數量的示例cv::mixChannels:
cv::Mat img1c = (cv::Mat_<double>(3, 1) << 1, 2, 3);
cv::Mat img4c(img1c.size(), CV_64FC4);
cv::Mat img1c_2(img1c.size(), CV_64FC1);
// Convert 1 channel into 4 (duplicate the channel):
std::vector<int> fromTo1{ 0,0, 0,1, 0,2, 0,3 }; // 0->0, 0->1, 0->2, 0->3
cv::mixChannels(img1c, img4c, fromTo1);
// Convert back to 1 channel (pick one of the channels - the 1st one in this case):
std::vector<int> fromTo2{ 0,0 }; // 0->0 (pick the 1st channel)
cv::mixChannels(img4c, img1c_2, fromTo2);
uj5u.com熱心網友回復:
正如我在您的其他問題中所評論的那樣,如果您想將Nx1 4-channel Mat 重新排列為 Nx4 1-channel,那么您需要使用cv::Mat::reshape()
some_mat.reshape(1)從 Nx1 K 通道 (CV_64FC4) 轉換為 NxK 1 通道 (CV_64FC1)
檔案:https ://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a4eb96e3251417fa88b78e2abd6cfd7d8
不過,您確實不需要任何這些,因為您說您想要矩陣乘法……或者更確切地說是矩陣向量乘積。你可以用cv::transform. transform 進行矩陣向量乘法,也適用于向量串列(Nx1 K 通道矩陣,也是 NxK 1-ch)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/495960.html
