OpenCv 查看图像中的每个像素值
OpenCv see each pixel value in an image
我正在 OpenCv(C++ 语言)中进行连通分量标记 (CCL) 操作。要查看 CCL 是否可靠工作,我必须在调试时检查图像中的每个像素值。我尝试将 CCL 的结果保存为图像,但是我无法达到像素的数字值。在调试操作期间有没有办法做到这一点?
当然有,但这取决于你使用的图像类型。
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_8UC1 类型的 cv::Mat 打印到文本文件,请使用以下代码:
// 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 中的项目调试设置中指定。
将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;
}
}
正如@Gombat 已经提到的,例如, in Visual Studio you can install Image Watch.
如果要将 Mat
的值保存到文本文件中,则无需重新创建任何内容(检查 OpenCV Mat: the basic image container)。
例如,您可以像这样简单地保存一个 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;
}
我正在 OpenCv(C++ 语言)中进行连通分量标记 (CCL) 操作。要查看 CCL 是否可靠工作,我必须在调试时检查图像中的每个像素值。我尝试将 CCL 的结果保存为图像,但是我无法达到像素的数字值。在调试操作期间有没有办法做到这一点?
当然有,但这取决于你使用的图像类型。
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_8UC1 类型的 cv::Mat 打印到文本文件,请使用以下代码:
// 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 中的项目调试设置中指定。
将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;
}
}
正如@Gombat 已经提到的,例如
如果要将 Mat
的值保存到文本文件中,则无需重新创建任何内容(检查 OpenCV Mat: the basic image container)。
例如,您可以像这样简单地保存一个 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;
}