如何使用浮点向量初始化 cv::Mat?

问题描述 投票:0回答:2

有没有办法使用

cv::Mat
对象初始化 opencv
vector<float>
? 或者我是否需要循环遍历向量的每个条目并将其写入
cv::Mat
对象?

opencv vector mat
2个回答
6
投票

我写了下面的测试代码(包括@Miki的评论)给自己详细理解。

你测试一下就明白了。

#include <opencv2/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
vector<float> vec{0.1,0.9,0.2,0.8,0.3,0.7,0.4,0.6,0.5,1};

Mat m1( vec ); 
imshow("m1",m1);
waitKey();

Mat m2( 1,vec.size(), CV_32FC1,vec.data());
imshow("m2",m2);
waitKey();

Mat1f m3( vec.size(), 1, vec.data());
imshow("m3",m3);
waitKey();

Mat1f m4( 1, vec.size(), vec.data());
imshow("m4",m4);
waitKey();

cout << "as seen below all Mat and vector use same data" << endl;
cout << vec[0] << endl;
m1 *= 2;
cout << vec[0] << endl;
m2 *= 2;
cout << vec[0] << endl;
m3 *= 2;
cout << vec[0] << endl;
m4 *= 2;
cout << vec[0] << endl;

return 0;
}

0
投票

OpenCv 支持 std::vector -> cv::Mat 映射有或没有副本它在文档中!

template<typename _Tp > 
cv::Mat::Mat(const std::vector< _Tp > &  vec, bool copyData = false);

示例:

vector<float> image(100); // vector with 100 floats (could be any supported types)
cv::Mat cv_image{image, false};

接下来,您可以根据给定的行数和通道数重塑结果图像:

int desired_rows = 10;
int desired_channels = 1;
cv_image = cv_image.reshape(desired_channels, desired_rows);
© www.soinside.com 2019 - 2024. All rights reserved.