学习OpenCV——Kmeans2算法并验证颜色种类(CvMat*&IplImage*指针的用法)

原创 2012年03月23日 14:16:05
#include <cv.h>
#include <highgui.h>
#include <iostream>


#define MAX_CLUSTERS (8)

using namespace std;

int main( int argc, char **argv)
{
IplImage *imgA = cvLoadImage( "D:/1.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if(imgA ==NULL)
{
cout<<"Can't Load Image ." << endl;
exit(0);
}

cvNamedWindow("window",CV_WINDOW_AUTOSIZE);
cvShowImage("window",imgA);//加载原图

unsigned long int size;
size = imgA->width * imgA->height;//取得图片大小

CvMat *clusters;//分类后的矩阵
clusters = cvCreateMat (size, 1, CV_32SC1);//32位1通道的矩阵
CvMat *points;//分类前的样例浮点矩阵
points = cvCreateMat (size, 1, CV_32FC3); //32位3通道的矩阵

unsigned long int i; 
for (i = 0; i < size; i++) 
{
//CvMat *point的访问方式->data.*,载入图像的访问方式->imagedata[],默认都是uchar类型,转换成float型 ☆☆☆☆☆☆☆☆☆☆☆☆☆
points->data.fl[i*3] = (unsigned char) imgA->imageData[i*3];
points->data.fl[i*3 + 1] = (unsigned char) imgA->imageData[i*3 + 1];
points->data.fl[i*3 + 2] = (unsigned char) imgA->imageData[i*3 + 2]; 
} //得到三通道图像的数据
//////////////////////////////////////////////////////////////////////////////
cvKMeans2 (points, MAX_CLUSTERS, clusters,
cvTermCriteria (CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 10, 1.0));
//拆分为8类聚合,最大迭代次数是10,精度是1.0

CvMat *color = cvCreateMat (MAX_CLUSTERS, 1, CV_32FC3);//8行1列的三通道浮点矩阵
CvMat *count = cvCreateMat (MAX_CLUSTERS, 1, CV_32SC1);//8行1列的单通道整数矩阵,用作计数
cvSetZero (color);
cvSetZero (count);

for (i = 0; i < size; i++)
{
int idx = clusters->data.i[i];
int j = ++count->data.i[idx];
//CvMat *color的访问方式 ☆☆☆☆☆☆☆☆☆☆☆☆☆
color->data.fl[idx * 3 ] = color->data.fl[idx * 3 ] * (j - 1) / j + points->data.fl[i * 3 ] / j;
color->data.fl[idx * 3 + 1] = color->data.fl[idx * 3 + 1] * (j - 1) / j + points->data.fl[i * 3 + 1] / j;
color->data.fl[idx * 3 + 2] = color->data.fl[idx * 3 + 2] * (j - 1) / j + points->data.fl[i * 3 + 2] / j;
}

//把处理过的数据打回imgA
for (i = 0; i < size; i++)
{
int idx = clusters->data.i[i];
//IplImage的访问方式->imageData☆☆☆☆☆☆☆☆☆☆☆☆☆

imgA->imageData[i * 3 ] = (char) color->data.fl[idx * 3 ];
imgA->imageData[i * 3 + 1] = (char) color->data.fl[idx * 3 + 1];
imgA->imageData[i * 3 + 2] = (char) color->data.fl[idx * 3 + 2];
}
IplImage* imgB=cvCreateImage(cvGetSize(imgA),8,1);
cvCvtColor(imgA,imgB,CV_RGB2GRAY);
map<int,int>ColorNum;
for (i = 0; i < size; i++)
{
	ColorNum[imgB->imageData[i]]++;
}
cout<<"ColorNum: "<<ColorNum.size()<<endl;

cvNamedWindow("window2",CV_WINDOW_AUTOSIZE);

cvShowImage("window2",imgA);

cvWaitKey(0);

cvReleaseImage( &imgA );

cvDestroyWindow("window");
cvDestroyWindow("window2");
return 0;
}

原图颜色减少到8种,视觉效果还可以。

相关文章推荐

OpenCV——Mat、CvMat、IplImage类型浅析

http://263796001-qq-com.iteye.com/blog/1409639 OpenCV中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage。   一、M...

OpenCv学习之:利用vs2008的IDE工具对IplImage、Mat、CvMat结构进行解析解析

从图中可以看出,利用IplImage* pImage=cvLoadImage(filename)来创建的IplImage型指针变量:pImage的地址是:0x017bfb60 需要注意的几个变量: ...

openCV学习笔记(9)Mat与IplImage,CvMat类型之间转换

opencv中图像数据容器一般有Mat,cvMat和IplImage。我们在平常的代码中,由于不同的函数的参数类型不一致,经常需要转换这三者之间的相互转化。网上有大量的杂七杂八的资料,望结合实际而用之...

学习OpenCV(3)CvMat,Mat和IplImage之间的转化和拷贝

原文链接1、CvMat之间的复制//注意:深拷贝 - 单独分配空间,两者相互独立 CvMat* a; CvMat* b = cvCloneMat(a); //copy a to b 2、...

OpenCV学习(八)之OpenCV中IplImage和CvMat图像数据结构

OpenCV中IplImage和CvMat的基本图像数据结构介绍以及图像通道数的介绍。
  • ZYTTAE
  • ZYTTAE
  • 2014年12月01日 20:27
  • 854

转:OpenCV学习之CvMat的用法详解及实例

转自:http://blog.csdn.net/yanzi1225627/article/details/7558112 致谢!! CvMat是OpenCV比较基础的函数。初学者应该掌握并熟练应...

OpenCV学习之CvMat的用法详解及实例

目    录     1.初始化矩阵:. 1 2.IplImage 到cvMat的转换. 1 3.cvArr(IplImage或者cvMat)转化为cvMat 1 4.图像直接操作. 2 ...

OpenCV学习之CvMat的用法详解及实例(三)

本文转载自 LOVE笨笨猪  http://blog.sina.com.cn/s/blog_74a459380101obhm.html 10.修改矩阵的形状——cvReshape的操作 经实验...

OpenCV学习之CvMat的用法详解及实例(一)

本文转载自   LOVE笨笨猪     http://blog.sina.com.cn/s/blog_74a459380101obhm.html OpenCV学习之CvMat的用法详解及实例 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习OpenCV——Kmeans2算法并验证颜色种类(CvMat*&IplImage*指针的用法)
举报原因:
原因补充:

(最多只允许输入30个字)