// Extract each pixel value using its location:
std::vector< int > pixelValues;
int totalPoints = (int)pixelLocations.size();
for( int i = 0; i < totalPoints; i++ ){
// Get pixel location:
cv::Point currentPoint = pixelLocations[i];
// Get pixel value:
int currentPixel = (int)grayImage.at<uchar>( currentPoint );
pixelValues.push_back( currentPixel );
// Print info:
std::cout<<"i: "<<i<<" currentPoint: "<<currentPoint<<" pixelValue: "<<currentPixel<<std::endl;
}
2条答案
按热度按时间yduiuuwa1#
在
C++
中,这并不像预期的那样简单。该操作分解为更进一步的更小的操作。一种实现std::vector
的方法是使用高于阈值的相同像素值,我使用this测试图像:上面的位只是创建了一个
cv::Mat
,其中每个高于阈值的像素都用255
的值绘制,否则用0
的值绘制。它(可能)等效于mask = src_img > 50
。现在,让我们用这个遮罩来遮罩原始灰度图像。考虑两个cv::Mat
之间的元素乘法。一种可能的方法是:现在我们有了原始的像素值,其他的都是零。这很方便,因为我们现在可以找到非零像素的位置:
好了,我们有一个
cv::Point
的std::vector
来定位每个非零像素,我们可以用这个信息来索引原始矩阵中的原始灰度像素:最后得到
pixelValues
,它是一个std::vector
,包含了所有超过阈值的像素的列表。hfwmuf9z2#
为什么你讨厌写循环?
我想这是最简单的办法:
因为我收到了一个神经质的投诉,我添加了一个收集值的例子。
在以下示例中,将遮罩图像
Mask
输入到该过程。