OpenCv видит значение каждого пикселя в изображении

Я работаю над операцией надписи связанных компонентов (CCL) в OpenCv (на языке C ++). Чтобы убедиться, что CCL работает надежно, я должен проверить значение каждого пикселя в изображении во время отладки. Я попытался сохранить результат CCL в виде изображения, однако мне не удалось достичь цифровых значений пикселей. Есть ли способ сделать это во время операции отладки?

0

Решение

Преобразуйте матрицу CCL в значения в диапазоне [0, 255] и сохраните ее как изображение. Например:

cv::Mat ccl = ...; // ccl operation returning CV_8U
double min, max;
cv::minMaxLoc(ccl, &min, &max);
cv::Mat image = ccl * (255. / max);
cv::imwrite("ccl.png", image);

Или сохраните все значения в файле:

std::ofstream f("ccl.txt");
f << "row col value" << std::endl;
for (int r = 0; r < ccl.rows; ++r) {
unsigned char* row = ccl.ptr<unsigned char>(r);
for (int c = 0; c < ccl.cols; ++c) {
f << r << " " << c << " " << static_cast<int>(row[c]) << std::endl;
}
}
0

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

Конечно, есть, но это зависит от типа изображения, которое вы используете.

http://docs.opencv.org/doc/user_guide/ug_mat.html#accessing-pixel-intensity-values

Какую IDE вы используете для отладки? Существует плагин для Visual Studio opencv:

http://opencv.org/image-debugger-plug-in-for-visual-studio.html
https://visualstudiogallery.msdn.microsoft.com/e682d542-7ef3-402c-b857-bbfba714f78d

Чтобы просто напечатать cv :: Mat типа CV_8UC1 в текстовый файл, используйте код ниже:

// create the image
int rows(4), cols(3);
cv::Mat img(rows, cols, CV_8UC1);

// fill image
for ( int r = 0; r < rows; r++ )
{
for ( int c = 0; c < cols; c++ )
{
img.at<unsigned char>(r, c) = std::min(rows + cols - (r + c), 255);
}
}

// write image to file
std::ofstream out( "output.txt" );

for ( int r = -1; r < rows; r++ )
{
if ( r == -1 ){ out << '\t'; }
else if ( r >= 0 ){ out << r << '\t'; }

for ( int c = -1; c < cols; c++ )
{
if ( r == -1 && c >= 0 ){ out << c << '\t'; }
else if ( r >= 0 && c >= 0 )
{
out << static_cast<int>(img.at<unsigned char>(r, c)) << '\t';
}
}
out << std::endl;
}

Просто замените img, rows, cols вашими переменными и оставьте часть «fill image» в стороне, и это должно работать. В первой строке и столбце указаны индексы этой строки / столбца. «output.txt» останется в вашем рабочем каталоге отладки, который вы можете указать в настройках отладки проектов в Visual Studio.

0

Как уже упоминалось @Gombat и, например, Вот, в Visual Studio вы можете установить Изображение Смотреть.

Если вы хотите сохранить значения Mat в текстовый файл, вам не нужно ничего изобретать (проверьте OpenCV Mat: базовый контейнер изображений).

Например, вы можете сохранить CSV-файл просто так:

Mat img;
// ... fill matrix somehow
ofstream fs("test.csv");
fs << format(img, "csv");

Полный пример:

#include <opencv2\opencv.hpp>
#include <iostream>
#include <fstream>

using namespace std;
using namespace cv;

int main()
{
// Just a green image
Mat3b img(10,5,Vec3b(0,255,0));

ofstream fs("test.csv");
fs << format(img, "csv");

return 0;
}
0