gpt4 book ai didi

visual-studio - 如何使用 Opencv 在矩阵中查找元素

转载 作者:行者123 更新时间:2023-12-02 17:48:12 25 4
gpt4 key购买 nike

我是 OpenCV 的新手。我想在向量元素和矩阵之间使用相等运算符来交叉检查两个值是否相等。怎么做?

提前致谢

最佳答案

我不确定我是否正确理解了您的问题,但如果您只想将向量的一个元素与矩阵的一个元素进行比较,可以通过以下方式完成:

cv::Vec3b vec(1, 2, 3);
cv::Mat mat(2, 2, CV_8UC1);
if (vec[0] == mat.at<uchar>(2, 1)) {
...
}

这会将 uchar 向量的第一个元素与 uchar 矩阵的第二行第一列元素进行比较。

如果要遍历矩阵,请按以下方式进行:

cv::Mat mat(2, 2, CV_8UC1);
uchar* ptr;
for (int row = 0; row < mat.rows; ++row) {
ptr = mat.ptr<uchar>(row);
for (int col = 0; cols < mat.cols; ++col) {
if(ptr[col] == ...)
}
}

编辑:相当于 float ,只需交换 uchar对于 float :

cv::Vec3f vec(1, 2, 3);
cv::Mat mat(2, 2, CV_32FC1);
if (vec[0] == mat.at<float>(2, 1)) {
...
}

和:

cv::Mat mat(2, 2, CV_32FC1);
float* ptr;
for (int row = 0; row < mat.rows; ++row) {
ptr = mat.ptr<float>(row);
for (int col = 0; cols < mat.cols; ++col) {
if(ptr[col] == ...)
}
}

如果您有多个 channel ptr[col]返回的不是一个值,而是一个矩阵数据类型的 OpenCV 向量以及与 channel 一样多的维度。也可以直接加一个 []带有您要访问的 channel 索引的运算符:

if(ptr[col][channel] == ...)

如何找出你的 cv::Mat 的数据类型?

从矩阵的类型和深度说明符中,您可以看到它们存储的数据类型:

  • CV_8U - 8-bit unsigned integers ( 0..255 )
  • CV_8S - 8-bit signed integers ( -128..127 )
  • CV_16U - 16-bit unsigned integers ( 0..65535 )
  • CV_16S - 16-bit signed integers ( -32768..32767 )
  • CV_32S - 32-bit signed integers ( -2147483648..2147483647 )
  • CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
  • CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )


这些是矩阵的深度说明符。您可以通过调用 cv::Mat::depth() 找出矩阵的深度。 .它们指定一个元素具有哪种数据类型。创建矩阵时使用的类型说明符还包含矩阵应具有多少 channel 的信息,只需添加 Cx到深度说明符, x是 channel 的数量,例如 CV_8UC3将是一个具有三个 channel 和 8 位无符号字符作为数据类型的矩阵(因此是一个非常普通的 8 位图像)。该信息可以通过调用 cv::Mat::type() 从现有矩阵中获得。 . channel 数量由 cv::Mat::channels() 返回.

对于 OpenCV 向量,这些类型说明符是相似的:

typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;

typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;

typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;

typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;

typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;

关于visual-studio - 如何使用 Opencv 在矩阵中查找元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30182398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com