将cv :: Vec3b矢量中包含R,G和B颜色值的矢量转换为cv :: Mat的最佳方法是什么?像素的位置无关紧要,我只想执行cv :: split操作,然后将所有三个颜色级别放入直方图。
我尝试过此操作,但由于拆分操作返回的cv :: Mat仅具有一种颜色的平面,所以它不起作用:
cv::Mat GetOnlyColoredPixel(cv::Mat& Gray, cv::Mat& Col) {
std::vector<cv::Vec3b> ColorStack;
cv::Vec3b vec;
int nPixel = 0;
for (int y = 0; y < Gray.rows; y++) {
for (int x = 0; x < Gray.cols; x++) {
if (Gray.at<unsigned char>(y, x) == 255) {
ColorStack.push_back(Col.at<cv::Vec3b>(y, x));
nPixel++;
}
}
}
return cv::Mat(1, nPixel, CV_8UC3, &ColorStack[0]);
}
奇怪的是,我实际上应该只有黄色像素,但是在打印MAT对象时,我得到了所有可能的颜色。 Col.at<cv::Vec3b>(y, x)
返回正确的颜色,但以RGB顺序-我认为OpenCV使用的是BGR。
谢谢你, 扬
答案 0 :(得分:0)
好的,返回错误。这段代码可以正常工作:
cv::Mat GetOnlyColoredPixel(cv::Mat& Gray, cv::Mat& Col) {
std::vector<cv::Vec3b> ColorStack;
cv::Vec3b vec, vec2;
cv::imwrite("C:\\HomeC\\Test.bmp", Col);
for (int y = 0; y < Gray.rows; y++) {
for (int x = 0; x < Gray.cols; x++) {
if (Gray.at<unsigned char>(y, x) == 255) {
//ColorStack.push_back(Col.at<cv::Vec3b>(y, x));
vec = Col.at<cv::Vec3b>(y, x);
ColorStack.push_back(vec);
}
}
}
cv::Mat RetVal = cv::Mat(1, ColorStack.size(), CV_8UC3);
memcpy(RetVal.data, ColorStack.data(), ColorStack.size() * sizeof(cv::Vec3b));
return RetVal;
}