2014-07-12 21 views

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 
+0

Tuyệt vời, cảm ơn! – eagle34

+1

tại sao bạn không sử dụng 'std :: set'? – Shai

+2

@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

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