Theo như tôi biết, tích hợp sẵn tách ra
sẽ chuyển đổi 3 kênh Thảm
Chia thành ba kênh 1 Thảm
. Kết quả là ba người này Thảm
Chỉ là thang độ xám với một số cường độ khác nhau.
Ý định của tôi là có được ba kênh 3 Thảm
, như hình dưới đây.
void SplitTo8UC3(const Mat& đầu vào, vector& đầu ra)
{
Mat blue = input.clone();
Màu xanh lá cây = input.clone();
Mat đỏ = input.clone();
const uint N = input.rows * input.step;
vì (uint i = 0; i < N; i += 3)
{
// blue.data[i]
green.data[i] = 0;
red.data[i] = 0;
blue.data[i + 1] = 0;
//green.data[i+1]
red.data[i + 1] = 0;
blue.data[i + 2] = 0;
green.data[i + 2] = 0;
//red.data[i+2]
}
đầu ra.push_back (màu xanh);
đầu ra.push_back (màu xanh lá cây);
đầu ra.push_back (màu đỏ);
}
Nó hoạt động, nhưng thay vì phát minh lại bánh xe, tôi đang tìm kiếm một cái tích hợp sẵn nếu có.
biên tập
Giải pháp được đề xuất phải nhanh hơn của tôi.
biên tập:Tôi đã kết hợp các đề xuất cải tiến của Dan từ nhận xét của anh ấy.
Tôi không thể nghĩ ra chức năng tích hợp nào để thực hiện việc này và tôi cũng không thể tìm thấy chức năng nào. Nhưng trong khi thực hiện một số nghiên cứu, tôi tình cờ thấy kênh trộn
chức năng, có thể cải thiện giải pháp của bạn. Ít nhất, nó tránh được việc thực hiện một vòng lặp.
Dưới đây là những sửa đổi tôi đã thực hiện đối với mã của bạn:
void SplitTo8UC3(const cv::Mat& đầu vào, std::vector& đầu ra)
{
// Phân bổ đầu ra
cv::Mat b(cv::Mat::zeros(input.size(), input.type()));
cv::Mat g(cv::Mat::zeros(input.size(), input.type()));
cv::Mat r(cv::Mat::zeros(input.size(), input.type()));
// Thu thập kết quả đầu ra
cv::Mat out[] = { b, g, r };
// Thiết lập cặp chỉ mục
int from_to[] = { 0,0, 1,4, 2,8 };
cv::mixChannels(&input, 1, out, 3, from_to, 3);
out.sign(std::begin(out), std::end(out));
}
Hãy có hình ảnh thử nghiệm nàymàu sắc.png
:
Sau đó, hãy có mã kiểm tra này:
cv::Mat img = cv::imread("images/colors.png");
std::vector bgr;
chiaTo8UC3(img, bgr);
cv::imwrite("images/b.png", bgr[0]);
cv::imwrite("images/g.png", bgr[1]);
cv::imwrite("images/r.png", bgr[2]);
Sau đó, chúng tôi nhận được đầu ra sau b.png
,g.png
Và r.png
, hy vọng đây là những giải pháp ban đầu dành cho bạn:
希望对您有所帮助!
Về opencv - có chức năng tích hợp để chia miếng đệm 3 kênh thành ba miếng đệm 3 kênh thay vì thành ba miếng đệm 1 kênh không? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/56473838/
Tôi là một lập trình viên xuất sắc, rất giỏi!