Có tương đương với np.unique()
hoặc bincount()
cho OpenCV Mat
không? Tôi đang làm việc với C++ vì vậy không thể chỉ chuyển đổi thành một mảng numpy
.Lấy danh sách các giá trị pixel duy nhất trong OpenCV Mat
7
A
Trả lời
12
Không, không có! Bạn có thể viết mã riêng của bạn, mặc dù:
std::vector<float> unique(const cv::Mat& input, bool sort = false)
Tìm các yếu tố độc đáo của một cv kênh đơn :: Mat.
Tham số:
đầu vào: Nó sẽ được đối xử như thể nó là 1-D.
sắp xếp: Sắp xếp các giá trị duy nhất (tùy chọn).
Việc thực hiện các chức năng như vậy là khá thẳng về phía trước, tuy nhiên, sau đây chỉ làm việc với kênh đơnCV_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;
}
Ví dụ:
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;
Đầu ra:
1 3 5 7 9 30 50 70 90
2
Bạn có thể thử tạo biểu đồ với số lượng thùng bằng số lượng giá trị pixel có thể có.
Các vấn đề liên quan
- 1. Cách lấy các giá trị duy nhất trong Danh sách
- 2. Lấy các giá trị duy nhất trong Danh sách Danh sách trong python
- 3. Lấy danh sách các giá trị pixel từ PIL
- 4. Làm thế nào để chỉnh sửa/đọc các giá trị pixel trong OpenCv từ biến Mat?
- 5. OpenCV: Nhận tổng giá trị Mat
- 6. Giới hạn trên và dưới và các loại giá trị pixel trong OpenCV là gì?
- 7. Lấy 3 giá trị cao nhất trong danh sách mảng?
- 8. C++ và opencv get và set màu pixel để Mat
- 9. Truy cập các giá trị pixel OpenCV 2.3 - C++
- 10. MySQL: Lấy giá trị và số duy nhất cho mỗi
- 11. Hàm Python 3.3 để hợp nhất các giá trị duy nhất tạo thành nhiều danh sách thành một danh sách
- 12. OpenCV 2.3: Chuyển đổi Mat thành mảng RGBA pixel
- 13. Lấy các giá trị duy nhất từ 2 mảng
- 14. Danh sách duy nhất từ danh sách
- 15. Cách lấy giá trị duy nhất trong mảng đa chiều
- 16. Lấy một giá trị duy nhất từ dataSet trong asp.net
- 17. Nhận các mục duy nhất từ danh sách danh sách?
- 18. Lưu một danh sách các Strings duy nhất trong ArrayList
- 19. Cách tạo danh sách bằng Python với các giá trị duy nhất của tệp CSV?
- 20. MongoDB tìm giá trị trong danh sách các danh sách
- 21. Lấy giá trị alpha pixel cho UIImage
- 22. Lấy danh sách các giá trị khác nhau trong Danh sách
- 23. Từ điển Python: Lấy danh sách các giá trị cho danh sách các phím
- 24. Lấy giá trị pixel của tệp BMP
- 25. Danh sách các danh sách LINQ trong một danh sách duy nhất
- 26. chuyển đổi danh sách các danh sách trong một danh sách duy nhất
- 27. Cách lấy giá trị trên một chỉ mục nhất định, trong danh sách python?
- 28. CONCATENATE Mat trong OpenCV
- 29. Lấy giá trị trả về duy nhất với PDO
- 30. Lấy danh sách duy nhấtXem SelectedItem
Tuyệt vời, cảm ơn! – eagle34
tại sao bạn không sử dụng 'std :: set'? – Shai
@Shai Có vẻ như một ý tưởng hay là ban đầu, nó có thể nhanh hơn từ quan điểm hiệu suất vì nó được bảo đảm để lưu trữ các giá trị duy nhất. Nó làm cho vô dụng 'std :: find()' tôi được đặt trong mã và nó sẽ tuyệt vời nếu 'cv :: Mat' của bạn là một kênh duy nhất và bạn cần lưu trữ một số nguyên. ** Tuy nhiên **, nếu bạn cần lưu trữ 'cv :: Vec3b' (một pixel) hoặc các kiểu dữ liệu phức tạp khác,' std :: vector' có thể phù hợp hơn với công việc. 'std :: set' lưu trữ các giá trị theo một thứ tự cụ thể và có thể muốn sắp xếp lại các giá trị này theo một kiểu khác, do đó' std :: vector' trong câu trả lời. – karlphillip