刚刚被imread折腾了一下下。经过大概是这样的:
我看的书是opencv 2 Computer Vision Application Programming Cookbook,刚开始看第二章。
看着命令和matlab基本一样,就打算些点小代码熟悉一下,处理对象就是我们公司自己采集的指纹图像,8位灰度图。于是按照自己的想法,有了如下代码:
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
const char* filename = "F:\\1ORIGINAL_0000.bmp";
Mat srcImg = imread(filename,CV_LOAD_IMAGE_GRAYSCALE );
if (!srcImg.data)
{
cout << "No Image!!!" << endl;
return 0;
}
cout << "Size is " << srcImg.size().height << ", "
<< srcImg.size().width << endl;
int i,j;
for (i = 0; i < 100; i ++)
{
for (j = 0; j < 100; j ++)
{
srcImg.at<uchar>(i,j) = 255;
}
}
namedWindow("My Image");
imshow("My Image", srcImg);
waitKey();
return 1;
}
理论上应该会在图像上请出一块100*100的白色正方形区域,可是结果却是一个长方形。前后检查了半天,感觉没有我想象中的“低级错误”后,我用imwrite把结果保存图像到本地,仔细看发现居然原来的灰度图中出现了绿色。丢进matlab一看变成了3channel的图了。因为上网不方便,我开始了乱七八糟的尝试,比如将读取图像的那一句改为了:
Mat srcImg(106,114,CV_8UC1);
srcImg = imread(filename);
想着这样你应该是单通道了吧,发现依旧顽固的是三通道。这点让我很诧异,这么智能。
把设置255的代码
srcImg.at<uchar>(i,j) = 255;
改为
srcImg.at<Vec3b>(i,j)[0] = 255;
srcImg.at<Vec3b>(i,j)[1] = 255;
srcImg.at<Vec3b>(i,j)[2] = 255;
后,自然就是正确的结果。不过我只是习惯于处理灰度图像,所以决定还是求助于网络,查看了下文档:
这才知道居然还有这样的选项。。。于是修改代码:
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
const char* filename = "F:\\1ORIGINAL_0000.bmp";
Mat srcImg = imread(filename,CV_LOAD_IMAGE_GRAYSCALE );
if (!srcImg.data)
{
cout << "No Image!!!" << endl;
return 0;
}
cout << "Size is " << srcImg.size().height << ", "
<< srcImg.size().width << ", " << srcImg.channels() << endl;
int i,j;
for (i = 0; i < 100; i ++)
{
for (j = 0; j < 100; j ++)
{
srcImg.at<uchar>(i,j) = 255;
}
}
namedWindow("My Image");
imshow("My Image", srcImg);
waitKey();
return 1;
}