如果您已经知道矩阵的类型,则可以轻松使用 @elvis.dukaj answer。您只需要遍历您的坐标并检索相应的像素值。
但是,如果您需要更通用的支持:
- 任何类型和通道的输入矩阵
- 坐标的输入列表可以是
cv::Mat 或std::vector,具有任何类型的坐标(int、float 等...)
您可能会发现这个getPixels 函数很有用:
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
Mat getPixels(InputArray _src, InputArray _coords)
{
// Get src matrix
Mat src = _src.getMat();
// Get coords matrix, eventually convert to integer type
Mat coords = _coords.getMat();
if (coords.type() != CV_32S)
{
coords.convertTo(coords, CV_32S);
}
// Check coordinates
int n = coords.checkVector(2, CV_32S);
CV_Assert(n > 0);
// Create output matrix
Mat dst(n, 1, src.type());
// Get pixel values at given coordinates
int esz = src.elemSize();
Point* coords_ptr = (Point*)coords.data;
uchar* dst_ptr = dst.data;
for (int i = 0; i < n; i++, dst_ptr += esz)
{
memcpy(dst_ptr, src.ptr(coords_ptr[i].y) + coords_ptr[i].x * esz, esz);
}
return dst;
}
int main()
{
Mat img(5, 5, CV_8UC1);
randu(img, Scalar(0, 0, 0), Scalar(10, 10, 10));
vector<Point> coor{ Point(1, 0), Point(0, 1), Point(2, 2) };
//cv::Mat coor = (cv::Mat_<float>(3, 2) << 1, 0, 0, 1, 2, 2);
Mat out = getPixels(img, coor);
cout << out;
return 0;
}