2016-01-24 625 views
4

在OpenCV(C++)中,我有一个图像,其中一些形状显示为白色(255)。知道这一点,我怎样才能得到这些对象在图像中的坐标点?我对获取所有白色像素坐标感兴趣。获取白色像素坐标(OpenCV)

有没有比这更清洁的方法?

std::vector<int> coordinates_white; // will temporaly store the coordinates where "white" is found 
for (int i = 0; i<img_size.height; i++) { 
    for (int j = 0; j<img_size.width; j++) { 
     if (img_tmp.at<int>(i,j)>250) { 
      coordinates_white.push_back(i); 
      coordinates_white.push_back(j); 
     } 
    } 
} 
// copy the coordinates into a matrix where each row represents a *(x,y)* pair 
cv::Mat coordinates = cv::Mat(coordinates_white.size()/2,2,CV_32S,&coordinates_white.front()); 

回答

7

有一个内置的功能,要做到这一点cv::findNonZero

返回非零像素的位置列表。

给定一个二进制矩阵(从操作容易返回诸如cv::threshold()cv::compare()>==,等等)返回所有非零指数作为cv::Matstd::vector<cv::Point>

例如:

cv::Mat binaryImage; // input, binary image 
cv::Mat locations; // output, locations of non-zero pixels 
cv::findNonZero(binaryImage, locations); 
// access pixel coordinates 
Point pnt = locations.at<Point>(i); 

cv::Mat binaryImage; // input, binary image 
vector<Point> locations; // output, locations of non-zero pixels 
cv::findNonZero(binaryImage, locations); 
// access pixel coordinates 
Point pnt = locations[i]; 
0

,你可以用这个方法来获得白色像素..希望它会帮助你。

for(int i = 0 ;i <image.rows() ; i++){// image:the binary image 
       for(int j = 0; j< image.cols() ; j++){ 
        double[] returned = image.get(i,j); 
        int value = (int) returned[0]; 
        if(value==255){ 
        System.out.println("x: " +i + "\ty: "+j);//(x,y) coordinates 
        } 
       } 

      }