【问题标题】:Get all pixels coordinates that have same color获取所有具有相同颜色的像素坐标
【发布时间】:2012-02-08 19:40:18
【问题描述】:

我想获取与一个像素颜色相同的所有像素坐标

List<cv::Point> GetAllPixels(cv::Point x)
{
//imp
}

如何在 EmguCV 或 OpenCV 中执行此操作?

【问题讨论】:

    标签: c# image-processing opencv emgucv


    【解决方案1】:

    这是使用 OpenCV C++ 的可能解决方案:

    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    using namespace cv;
    
    std::vector<cv::Point> getPixelsWithColor(const cv::Mat& src, cv::Scalar targetColor)
    {
        assert(src.type() == CV_8UC3);
    
        std::vector<cv::Point> identicalPoints;
    
        for(int row = 0; row < src.rows; ++row)
        {
            for(int col = 0; col < src.cols; ++col)
            {
                cv::Vec3b currPixel = src.at<cv::Vec3b>(row, col);
                if(currPixel[0] == targetColor.val[0] &&
                   currPixel[1] == targetColor.val[1] &&
                   currPixel[2] == targetColor.val[2])
                {
                    identicalPoints.push_back(cv::Point(col, row));
                }
            }
        }
    
        return identicalPoints;
    }
    
    int main(int argc, char** argv)
    {
        Mat squares = imread("colored_squares.png");
    
        const Scalar RED = Scalar(0, 0, 255); // OpenCV is BGR order...
        vector<Point> redPixelLocations;
        redPixelLocations = getPixelsWithColor(squares, RED);
    
        Mat redMask = Mat::zeros(squares.size(), CV_8UC1);
    
        vector<Point>::iterator i;
        for(i = redPixelLocations.begin(); i != redPixelLocations.end(); ++i)
        {
            redMask.at<uchar>(*i) = 255;
        }
    
        imshow("Squares", squares);
        imshow("Red mask", redMask);
        waitKey();
    
        return 0;
    }
    

    我使用了这个输入图像:

    并实现了这个输出图片:

    享受吧! :)

    【讨论】:

      【解决方案2】:

      答案应该可以帮助您入门。也可以考虑使用Cmp函数

      IplImage 可能是这样的:

      IplImage *img, *col_img, *mask_img;
      // initialise images appropriately...
      svSet(col_img, [colour of your choise]);
      cvCmp(img, col_img, mask_img, CV_CMP_EQ);
      

      使用mask_img 提取坐标。您可能会发现 cv::Mat 的等效操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-28
        • 1970-01-01
        • 2012-11-09
        • 1970-01-01
        相关资源
        最近更新 更多