[英]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.