OpenCV: Найти все ненулевые координаты двоичного изображения Mat

Я пытаюсь найти ненулевые (x, y) координаты двоичного изображения.

Я нашел несколько ссылок на функцию countNonZero() который только считает ненулевые координаты и findNonZero() который я не уверен, как получить доступ или использовать, так как он, кажется, был полностью удален из документации.

это самая близкая ссылка, которую я нашел, но все еще бесполезный вообще. Буду признателен за любую конкретную помощь.

Редактировать:
— Чтобы указать, это с помощью C ++

18

Решение

Вот это объяснение того, как findNonZero() сохраняет ненулевые элементы. Следующие коды должны быть полезны для доступа к ненулевым координатам вашего двоичный образ. Метод 1 используется findNonZero() в OpenCV, а метод 2 проверял все пиксели, чтобы найти ненулевые (положительные).

Способ 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;
}

Способ 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;
}
31

Другие решения

Существует следующий исходный код, который был поставляется для 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));
}
}
}

Примечание: похоже, что подпись функции была неправильной, поэтому я изменил вывод vector передать по ссылке.

5

Вы можете найти его, не используя findNonZero () этот метод opencv. скорее вы можете получить это, просто используя 2 для циклов. вот фрагмент. надеюсь, что это может помочь вам.

**

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.
}
}

}

**

-2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector