png格式的圖片除了能展現出各種各樣的色彩外,還能表現出“透明”的特點,這是因爲這種格式的圖片除了含有我們常見的RGB三個顏色通道外,還有一個A通道來控制圖片的透明效果。使用openCV可以方便的查看各種格式圖片各個通道的值,思路如下:
- 首先,我們需要加載一幅圖片;
- 爲了能夠查看這個圖片上每個像素點各個通道的數值,我們可以通過鼠標點擊的方式來選擇像素點,然後讀取這個像素點各通道的數值,並顯示出來;
- 爲了判斷顯示是否正確,還可以新建一幅圖片,用所選擇像素點的顏色填充,判斷這幅圖片的顏色是否是我們選擇的顏色。
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
IplImage *src;
IplImage *show;
void mouseHandler(int event, int x, int y, int flags, void *param);
int main()
{
char *picture = "D:\\test\\2\\2.png";
if((src = cvLoadImage(picture,CV_LOAD_IMAGE_UNCHANGED)) == 0)
{
cout<<"read Picture error"<<endl;
return -1;
}
cvNamedWindow("picture", CV_WINDOW_AUTOSIZE);
cvSetMouseCallback("picture",mouseHandler,NULL);
cvShowImage("picture",src);
show = cvCreateImage(cvSize(200,200),src->depth,src->nChannels);
cvZero(show);
cvNamedWindow("show", CV_WINDOW_AUTOSIZE);
cvWaitKey();
}
void mouseHandler(int event, int x, int y, int flags, void *param)
{
int R = 0,G = 0,B = 0,A = 0;
uchar *c_src;
ushort *s_src;
uchar *c_dst;
ushort *s_dst;
switch(event)
{
case CV_EVENT_LBUTTONDOWN:
cout<<"x = "<<x<<",y = "<<y<<endl;
//得到選擇像素點的值
if(src->depth == IPL_DEPTH_8U)
{
c_src = (uchar *)(src->imageData + y*src->widthStep + x*src->nChannels);
B = c_src[0];
G = c_src[1];
R = c_src[2];
A = c_src[3];
}
else if(src->depth == IPL_DEPTH_16U)
{
s_src = (ushort *)(src->imageData + y*src->widthStep + x*src->nChannels);
B = s_src[0];
G = s_src[1];
R = s_src[2];
A = s_src[3];
}
cout<<"B = "<<B<<",G = "<<G<<",R = "<<R<<",A = "<<A<<endl<<endl;
//複製
if(show->depth = IPL_DEPTH_8U)
{
for(int i = 0; i < show->height;i++)
{
for(int j = 0;j < show->width;j++)
{
c_dst = (uchar *)(show->imageData + i * show->widthStep + j * show->nChannels);
memcpy(c_dst,c_src,sizeof(uchar)*src->nChannels);
}
}
}
else if(show->depth = IPL_DEPTH_16U)
{
for(int i = 0; i<show->height;i++)
{
for(int j = 0;j<show->width;j++)
{
s_dst = (ushort *)(show->imageData + i * show->widthStep + j * show->nChannels);
memcpy(s_dst,s_src,sizeof(ushort)*src->nChannels);
}
}
}
cvShowImage("show",show);
//cvSaveImage("E:\\1.png",show);
break;
default:
break;
}
}