我正在尝试从C ++中的图像创建一个OpenPose数组(请参见https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/73093e909a884f48df4f0b92d4d8ee6724954ba3/include/openpose/core/array.hpp)。
我用加载图像
cv::Mat image = cv::imread(inputImageLocation, CV_LOAD_IMAGE_COLOR);
效果很好。由于我想调用另一个需要OpenCV数组作为输入的OpenCV函数,因此必须转换此cv::Mat
对象。我使用了setFrom(const cv::Mat& cvMat);
:
// Convert Mat to float.
image.convertTo(image, CV_32F);
// Create OpenCV Array from cv::Mat.
op::Array<float> res = op::Array<float>();
res.setFrom(image);
这会导致以下错误:
Error:
Array<T>: T type and cvMat type are different.
Coming from:
- /openpose/src/openpose/core/array.cpp:setFrom():322
- /openpose/src/openpose/core/array.cpp:setFrom():331
terminate called after throwing an instance of 'std::runtime_error'
不太确定为什么cvMat
和T
在这里应该是不同的类。我将不胜感激。
[更新] 这种初始化数组res
的方法似乎更接近正确的方法:
std::vector<int> dimSizes = std::vector<int>();
dimSizes.push_back(image.size().width);
dimSizes.push_back(image.size().height);
dimSizes.push_back(image.channels());
op::Array<float> res = op::Array<float>(dimSizes);
cv::Mat arrMat = res.getConstCvMat();
std::cout << image.rows << " vs. " << arrMat.rows << std::endl;
std::cout << image.cols << " vs. " << arrMat.cols << std::endl;
std::cout << image.size() << " vs. " << arrMat.size() << std::endl;
std::cout << image.type() << " vs. " << arrMat.type() << std::endl;
std::cout << image.channels() << " vs. " << arrMat.channels() << std::endl;
res.setFrom(image);
这会产生相同的错误,但是此处产生的输出是
20 vs. 20
20 vs. 20
[20 x 20] vs. [20 x 20]
21 vs. 21
3 vs. 3
因此OpenPose抱怨cvMat类型不同,但是显然它们不是-我不太确定该怎么做。