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; } }