我是OpenCV的新手。我想在向量元素和矩阵之间使用相等运算符来交叉检查两个值是否相等的位置。怎么样?
提前致谢
答案 0 :(得分:1)
我不确定我是否正确理解了您的问题,但如果您只是想将矢量的一个元素与矩阵的一个元素进行比较,则可以通过以下方式完成:
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] == ...)
}
}
编辑:相当于浮动,只需与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] == ...)
}
}
如果您有多个频道ptr[col]
,则返回的不是一个值,而是一个矩阵'数据类型的OpenCV向量,以及与您有频道的维度。您还可以直接添加另一个[]
运算符,其中包含您要访问的频道的索引:
if(ptr[col][channel] == ...)
从矩阵的类型和深度说明符中,您可以看到它们存储的数据类型:
- CV_8U - 8位无符号整数(0..255)
- CV_8S - 8位有符号整数(-128..127)
- CV_16U - 16位无符号整数(0..65535)
- CV_16S - 16位有符号整数(-32768..32767)
- CV_32S - 32位有符号整数(-2147483648..2147483647)
- CV_32F - 32位浮点数(-FLT_MAX..FLT_MAX,INF,NAN)
- CV_64F - 64位浮点数(-DBL_MAX..DBL_MAX,INF,NAN)
这些是矩阵的深度说明符。您可以通过调用cv::Mat::depth()
找出矩阵的深度。它们指定一个元素具有哪种数据类型。您在创建矩阵时使用的类型说明符还包含矩阵应具有的通道数量的信息,只需将Cx
添加到深度说明符,x
是通道的数量,例如: CV_8UC3
将是一个矩阵,有三个通道和8位无符号字符作为数据类型(所以非常正常的8位图像)。可以通过调用cv::Mat::type()
从现有矩阵获得此信息。渠道数量由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;