cv::imread的flags

刚刚被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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值