您的位置:首页 > 其它

cv::imread的flags

2015-06-05 15:59 351 查看
刚刚被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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: