Я только начал изучать OpenCV, и мне интересно, как я могу преобразовать изображение, подобное этому:
В сетку занятости, как эта:
int grid[ROW][COL] =
{
{ 1, 0, 1, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 1, 0, 1, 1, 1, 0, 1, 1 },
{ 1, 1, 1, 0, 1, 1, 0, 1, 0, 1 },
{ 0, 0, 1, 0, 1, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 0, 1, 1, 1, 0, 1, 0 },
{ 1, 0, 1, 1, 1, 1, 0, 1, 0, 0 },
{ 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 1, 0, 0, 0, 1, 0, 0, 1 }
};
1: cell is not blocked (white pixel).
0: cell is blocked (black pixel).
Я не собираюсь использовать именно эту картинку. Я собираюсь использовать картинку только со стенами: без текста, без мебели, без окон и символов дверей. Там будут только стены с «дырами», чтобы показать двери.
Я хочу прочитать изображение и вернуть 1, когда пиксель белый, и 0, когда пиксель черный. Только это.
Как я могу сделать это с OpenCV?
Я сохраню эту матрицу в текстовый файл, но я знаю, как это сделать.
Не беспокойтесь о том, что я буду делать с этой матрицей. Я не об этом спрашиваю.
сначала нужно было бы сэмплировать ваше изображение как сетку, тогда базовая реализация была бы, если квадрат сетки полностью белый, он не заблокирован.
Я не понимаю этот вопрос. Если изображение содержит только черные и белые пиксели, в чем проблема? Прочитайте изображение, и у вас уже есть нулевые и ненулевые значения. Преобразуйте ненулевое значение в единицу, и все готово.
@user1241241 user1241241 Где небольшая ошибка? В этом вопросе или в ответе ниже?
Mat
в OpenCV, как сетка, которую вы упомянули. .pgm
— это формат, используемый в операционной системе роботов для хранения карт сетки занятости. Любой формат изображения подходит для представления.
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
//read input image as gray
Mat image_gray = imread("input.jpg", CV_LOAD_IMAGE_GRAYSCALE);
// convert gray image to binary image
// After threshold, all values are either (0 or 200)
Mat imgage_bw;
cv::threshold(image_gray, imgage_bw, 200, 255.0, THRESH_BINARY);
// if you really want images with 0 for blocked cell and 1 for free cell
Mat image_grid = imgage_bw/255;
// save to disk
imwrite("output.pgm", image_grid);
//write result to text file
FileStorage file("ouput.yaml", cv::FileStorage::WRITE);
file <<"grid " <<image_grid;
file.release();
return 0;
}
вывод.yaml
%YAML:1.0
grid : !!opencv-matrix
rows: 400
cols: 800
dt: u
data: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ....]
Связаны ли предоставленное изображение и сетка каким-либо образом? Вы должны указать, как вы получаете значения
0
и1
в своей сетке из своего изображения, прежде чем кто-либо сможет начать думать о решении вашей реальной (программной?) проблемы.