- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将MATLAB代码转换为C++。
在MATLAB中,我使用find
函数获取 vector 的索引,然后将其复制到其他变量。例如:
idx = find(A>s);
B = idx;
% A, idx, and B are vectors; s is a scalar
在C++ OpenCV(C++ 14 / OpenCV 3.4.10)中,我知道我可以使用
findNonZero
函数,但它同时返回行索引和列索引:
double s;
Mat1d A;
Mat1i B;
Mat idx;
.
.
.
findNonZero(A>s, idx);
我不知道如何直接直接复制行索引(不使用
for
循环)。我认为可以通过定义
Mat2i idx
并使用
mixChannels
这样来完成:
Mat2i idx;
findNonZero(A>s, idx);
B = Mat1i::zeros(idx.size());
int from_to[] = {1, 0};
mixChannels(&idx, 1, &B, 1, from_to, 1);
但是,在运行
findNonZero
函数时出现以下错误:
OpenCV(3.4.10) Error: Assertion failed (!fixedType() || ((Mat*)obj)->type() == mtype) in cv::debug_build_guard::_OutputArray::create,
Mat idx
,则在运行
mixChannel
函数时出现另一个错误:
OpenCV(3.4.10) Error: Assertion failed (j < nsrcs && src[j].depth() == depth) in cv::mixChannels,
最佳答案
MATLAB的find
确定列-主要索引,这些索引的值在输入矩阵中为非零值。如果指定单个输出版本,则为true。如果提供两个输出变量,则将生成输入中非零值的行和列位置。在您的示例中,您提供了find
的单个输出版本,因此我将对此进行处理。
OpenCV的cv::Mat
将图像布置在行主要中。我假设您想要行优先索引。如果是这样,由于cv::findNonZero
同时输出行和列坐标,因此您必须自己遍历输出坐标并创建行主要索引。您不必担心在这里使用循环。实际上,for
上的cv::Mat
循环已针对快速访问进行了优化。因此:
Mat2i idx;
Mat1d A; // Define somewhere else
double s; // Define somewhere else
findNonZero(A > s, idx);
B = Mat1i::zeros(idx.total());
for (int i = 0; i < idx.total(); ++i) {
B.at<int>(i) = idx.at<Point>(i).y * A.cols + idx.at<Point>(i).x;
}
B
将在
cv::Mat1i
中包含行优先索引。如果我误解了您的查询,只是想要非零值的行位置,那么就可以了:
Mat2i idx;
Mat1d A; // Define somewhere else
double s; // Define somewhere else
findNonZero(A > s, idx);
B = Mat1i::zeros(idx.total());
for (int i = 0; i < idx.total(); ++i) {
B.at<int>(i) = idx.at<Point>(i).y;
}
请记住,您仅在非零值上进行迭代,因此最坏的情况是在非零位置上进行迭代。
关于c++ - 从C++ OpenCV中的findNonZero函数仅复制Mat的行索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63698322/
在我的 android 应用程序中,我使用 findNonZero() 查找和访问二值图像中的白点。 我将图像(binMat,大小为:595*800)作为方法的输入,然后我有: ... Mat wLo
我是 OpenCV 的初学者,我已经阅读了一些教程和手册,但我无法完全理解某些内容。 目前,我正在尝试将二值图像裁剪成两部分。我想知道哪一行的白色像素最多,然后裁剪掉该行及其上方的所有内容,然后仅使用
我试图将 Mat img1 的非零元素索引存储到 vector vp1 中,但它显示了 cv::Exception at memory location 错误。当垫子不包含任何非零元素时会发生这种情况
这里是个愚蠢的问题。 我想从一些黑白图像中找到像素的位置,并从 Numpy 库和 OpenCV 中找到了这两个函数。 我在网上找到的例子(http://docs.opencv.org/trunk/d1
我是一名优秀的程序员,十分优秀!