gpt4 book ai didi

c++ - 获取 OpenCV Mat 中唯一像素值的列表

转载 作者:可可西里 更新时间:2023-11-01 17:25:40 25 4
gpt4 key购买 nike

对于 OpenCV Mat,是否有等效于 np.unique()bincount() 的方法?我正在使用 C++,所以不能只转换为 numpy 数组。

最佳答案

不,没有!不过您可以编写自己的代码:

std::vector<float> unique(const cv::Mat& input, bool sort = false)

Find the unique elements of a single channel cv::Mat.

Parameters:

input: It will be treated as if it was 1-D.

sort: Sorts the unique values (optional).

此类功能的实现非常简单,但是,以下仅适用于单 channel CV_32F:

#include <algorithm>
#include <vector>

std::vector<float> unique(const cv::Mat& input, bool sort = false)
{
if (input.channels() > 1 || input.type() != CV_32F)
{
std::cerr << "unique !!! Only works with CV_32F 1-channel Mat" << std::endl;
return std::vector<float>();
}

std::vector<float> out;
for (int y = 0; y < input.rows; ++y)
{
const float* row_ptr = input.ptr<float>(y);
for (int x = 0; x < input.cols; ++x)
{
float value = row_ptr[x];

if ( std::find(out.begin(), out.end(), value) == out.end() )
out.push_back(value);
}
}

if (sort)
std::sort(out.begin(), out.end());

return out;
}

示例:

float data[][3] = {
{ 9.0, 3.0, 7.0 },
{ 3.0, 9.0, 3.0 },
{ 1.0, 3.0, 5.0 },
{ 90.0, 30.0, 70.0 },
{ 30.0, 90.0, 50.0 }
};

cv::Mat mat(3, 5, CV_32F, &data);

std::vector<float> unik = unique(mat, true);

for (unsigned int i = 0; i < unik.size(); i++)
std::cout << unik[i] << " ";
std::cout << std::endl;

输出:

1 3 5 7 9 30 50 70 90 

关于c++ - 获取 OpenCV Mat 中唯一像素值的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24716932/

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