简体   繁体   English

OpenCV:查找二进制Mat图像的所有非零坐标

[英]OpenCV: Find all non-zero coordinates of a binary Mat image

I'm atttempting to find the non-zero (x,y) coordinates of a binary image. 我正在尝试查找二进制图像的非零(x,y)坐标。

I've found a few references to the function countNonZero() which only counts the non-zero coordinates and findNonZero() which I'm unsure how to access or use since it seems to have been removed from the documentation completely. 我发现了对函数countNonZero()的一些引用,该函数仅计算非零坐标和findNonZero() ,我不确定如何访问或使用它,因为它似乎已完全从文档中删除。

This is the closest reference I found, but still not helpful at all. 是我找到的最接近的参考,但仍然没有帮助。 I would appreciate any specific help. 我将不胜感激。

Edit: - To specify, this is using C++ 编辑:-要指定,这是使用C ++

Here is an explanation for how findNonZero() saves non-zero elements. 是有关findNonZero()如何保存非零元素的说明。 The following codes should be useful to access non-zero coordinates of your binary image. 以下代码对于访问二进制图像的非零坐标应该很有用。 Method 1 used findNonZero() in OpenCV, and Method 2 checked every pixels to find the non-zero (positive) ones. 方法1在OpenCV中使用findNonZero() ,方法2检查每个像素以找到非零(正)像素。

Method 1: 方法1:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;

int main(int argc, char** argv) {
    Mat img = imread("binary image");
    Mat nonZeroCoordinates;
    findNonZero(img, nonZeroCoordinates);
    for (int i = 0; i < nonZeroCoordinates.total(); i++ ) {
        cout << "Zero#" << i << ": " << nonZeroCoordinates.at<Point>(i).x << ", " << nonZeroCoordinates.at<Point>(i).y << endl;
    }
    return 0;
}

Method 2: 方法2:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;

int main(int argc, char** argv) {
    Mat img = imread("binary image");
    for (int i = 0; i < img.cols; i++ ) {
        for (int j = 0; j < img.rows; j++) {
            if (img.at<uchar>(j, i) > 0) {  
                cout << i << ", " << j << endl;     // Do your operations
            }
        }
    }
    return 0;
}

There is the following source code that was supplied for OpenCV 2.4.3 , which may be helpful: OpenCV 2.4.3提供了以下源代码,这可能会有所帮助:

#include <opencv2/core/core.hpp>
#include <vector>

/*! @brief find non-zero elements in a Matrix
 *
 * Given a binary matrix (likely returned from a comparison
 * operation such as compare(), >, ==, etc, return all of
 * the non-zero indices as a std::vector<cv::Point> (x,y)
 *
 * This function aims to replicate the functionality of
 * Matlab's command of the same name
 *
 * Example:
 * \code
 *  // find the edges in an image
 *  Mat edges, thresh;
 *  sobel(image, edges);
 *  // theshold the edges
 *  thresh = edges > 0.1;
 *  // find the non-zero components so we can do something useful with them later
 *  vector<Point> idx;
 *  find(thresh, idx);
 * \endcode
 *
 * @param binary the input image (type CV_8UC1)
 * @param idx the output vector of Points corresponding to non-zero indices in the input
 */
void find(const cv::Mat& binary, std::vector<cv::Point> &idx) {

    assert(binary.cols > 0 && binary.rows > 0 && binary.channels() == 1 && binary.depth() == CV_8U);
    const int M = binary.rows;
    const int N = binary.cols;
    for (int m = 0; m < M; ++m) {
        const char* bin_ptr = binary.ptr<char>(m);
        for (int n = 0; n < N; ++n) {
            if (bin_ptr[n] > 0) idx.push_back(cv::Point(n,m));
        }
    }
}

Note - it looks like the function signature was wrong so I've changed the output vector to pass-by-reference. 注意-看起来函数签名是错误的,因此我将输出vector更改为按引用传递。

you can find it without using findNonZero() this opencv method. 您可以在不使用findNonZero()这个opencv方法的情况下找到它。 rather u can get it by simply using 2 for loops. 相反,您只需使用2 for循环就可以得到它。 here is the snippet. 这是代码段。 hope it can help u. 希望它可以帮助你。

** **

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);// returned the (x,y) //co ordinates of all white pixels.
                }
            }

        }

** **

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM