Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV图像分析中如何跳过掩模_C++_Opencv - Fatal编程技术网

C++ OpenCV图像分析中如何跳过掩模

C++ OpenCV图像分析中如何跳过掩模,c++,opencv,C++,Opencv,我有一个掩码数组mask,我有两个图像F和G。我想对F和G仅对mask为真的像素执行一些统计(其中一些可能是自定义的,因此我需要能够访问特定元素) 我可以在F和G之间循环,然后查看mask的值,但是掩蔽函数非常自由,所以我只需要查看大约.01%的图像。在这种情况下,我花费99.99%的时间在if语句中,如果可能的话,我想尝试对这些操作进行矢量化(或者至少减少if比较,因为这可能是大量的) 我的问题是-我如何才能有效地只查看F和G中那些mask与真(或假…这里哪个更有意义)关联的像素?正如前面指出

我有一个掩码数组
mask
,我有两个图像
F
G
。我想对
F
G
仅对
mask
为真的像素执行一些统计(其中一些可能是自定义的,因此我需要能够访问特定元素)

我可以在
F
G
之间循环,然后查看
mask
的值,但是掩蔽函数非常自由,所以我只需要查看大约.01%的图像。在这种情况下,我花费99.99%的时间在
if
语句中,如果可能的话,我想尝试对这些操作进行矢量化(或者至少减少
if
比较,因为这可能是大量的)


我的问题是-我如何才能有效地只查看
F
G
中那些
mask
与真(或假…这里哪个更有意义)关联的像素?

正如前面指出的,讨论对原始像素的矢量化操作毫无意义,因为它们在内存中几乎肯定不是连续的

为了说明这一点,我使用了一个
向量
来存储强度,然后在分析中使用这些连续变量。在下面的代码中,
X
是我用作遮罩的图像,
R
G
是我要从中获取强度的单独图像

cv::Mat locs;
cv::findNonZero(X, locs);

std::vector< double > Rs(locs.rows);
std::vector< double > Gs(locs.rows);

for(int ip = 0; ip < locs.rows; ip++) {
    cv::Point p = locs.at<cv::Point>(ip);
    Rs[ip] = ( (double)R.at<uchar>(p) );
    Gs[ip] = ( (double)G.at<uchar>(p) );
}

正如所指出的,讨论对原始像素的矢量化操作毫无意义,因为它们几乎肯定不会在内存中连续

为了说明这一点,我使用了一个
向量
来存储强度,然后在分析中使用这些连续变量。在下面的代码中,
X
是我用作遮罩的图像,
R
G
是我要从中获取强度的单独图像

cv::Mat locs;
cv::findNonZero(X, locs);

std::vector< double > Rs(locs.rows);
std::vector< double > Gs(locs.rows);

for(int ip = 0; ip < locs.rows; ip++) {
    cv::Point p = locs.at<cv::Point>(ip);
    Rs[ip] = ( (double)R.at<uchar>(p) );
    Gs[ip] = ( (double)G.at<uchar>(p) );
}

1) 大多数OpenCV函数都接受掩码作为输入参数。2) 或者,您可以在for循环中检查掩码值,如您所述。这并不是很慢,只是用一种聪明的方式。3) 或者,您可以使用
findNonZero
获取掩码中所有非零的点。在任何情况下,您都需要扫描遮罩。如果您有一个想要执行的操作的示例,我们可以给出更详细的答案。使用std::vector而不是mask如何?对于内存中稀疏分布的元素,向量化应该如何工作/受益?一开始你考虑过使用稀疏矩阵吗?1)大多数OpenCV函数都接受掩码作为输入参数。2) 或者,您可以在for循环中检查掩码值,如您所述。这并不是很慢,只是用一种聪明的方式。3) 或者,您可以使用
findNonZero
获取掩码中所有非零的点。在任何情况下,您都需要扫描遮罩。如果您有一个想要执行的操作的示例,我们可以给出更详细的答案。使用std::vector而不是mask如何?对于内存中稀疏分布的元素,向量化应该如何工作/受益?一开始你有没有想过使用稀疏的垫子?