三个调不出预期结果的小程序!来者有分!!

crystal8700 2010-04-25 11:15:51
程序一:我想读入一幅图像,将它用Reshape函数处理成一列的数组后,再采用cvKMeans2函数进行聚类处理,处理完后再将clusters矩阵用Reshape函数变成原型,最后显示出图像。可是结果是显示出的是一幅全黑的图像。不知道为什么?
#include "stdafx.h"
#include"cv.h"
#include"highgui.h"
#include"stdio.h"
#define MAX_CLUSTERS 2

int main(int argc,char** argv)
{
IplImage* img_ori=cvLoadImage("D:\\001.jpg",0);
CvMat* mat=cvCreateMat(img_ori->height,img_ori->width,CV_32FC1);
cvZero(mat);
cvConvert(img_ori,mat);
CvRNG rng=cvRNG(0xffffffff);

int cluster_count=cvRandInt(&rng)%MAX_CLUSTERS+1;//聚类数,它是随机产生的,上界是MAX_CLUSTERS
int N=img_ori->height*img_ori->width;
CvMat pointshdr,*points=cvReshape(mat,&pointshdr,1,N);
CvMat* clusters=cvCreateMat(N,1,CV_32SC1);

cvKMeans2(points,cluster_count,clusters,cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,10,1.0));
CvMat dsthdr,*dst=cvReshape(clusters,&dsthdr,1,img_ori->height);
cvNamedWindow("crystal",0);
cvShowImage("crystal",dst);
cvWaitKey(0);
cvReleaseMat(&mat);
cvReleaseMat(&clusters);
cvDestroyWindow("crystal");
}

程序二:为什么我明明设定的是在坐标(0,39)处的值为最大值,但最显示的是坐标(39,0)呢?
#include"stdafx.h"
#include"cv.h"
#include"highgui.h"
#include"stdio.h"
void main()
{
IplImage* img=cvCreateImage(cvSize(100,100),IPL_DEPTH_64F,1);
cvZero(img);
cvSetReal2D(img,0,39,233);
double min,max;
CvPoint minLoc,maxLoc;
cvMinMaxLoc(img,&min,&max,&minLoc,&maxLoc);
printf("maxLoc=(%d,%d)\n",maxLoc.x,maxLoc.y);
}
程序三:最后得到的矩阵b中应该是一系列的0和1的组和,但是显示的结果却全部是0.为什么呢?#include"stdafx.h"
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#define k 2
void main()
{
IplImage* img=cvLoadImage("D:\\001.jpg",0);
double min,max;
CvPoint minPnt;
CvPoint maxPnt;
int N=img->height*img->width;
CvMat mathdr,*mat=cvReshape(img,&mathdr,1,1);//将mat变形成一行的,以便于处理
CvMat* Mat=cvCreateMat(1,k,CV_64FC1);
cvZero(Mat);
CvMat* tmp=cvCreateMat(1,k,CV_64FC1);
CvMat* b=cvCreateMat(k,N,CV_8SC1);
cvZero(b);
//顺序从mat中取k个数赋给Mat
for(int j=0;j<k;j++)
cvSetReal1D(Mat,j,cvGetReal1D(mat,j));
//将xj-mi的值存储在tmp矩阵中
for(int j=0;j<N;j++)
{
cvZero(tmp);
for(int i=0;i<k;i++)
{
cvSetReal1D(tmp,i,abs(cvGetReal1D(mat,j)-cvGetReal1D(Mat,i)));
cvMinMaxLoc(tmp,&min,&max,&minPnt,&maxPnt,NULL);
cvSetReal2D(b,minPnt.y,j,1);
}
}
for(int i=0;i<k;i++)
for(int j=0;j<10;j++)
printf("%d ",cvGetReal2D(b,i,j));

}

...全文
241 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
jhayumu 2010-10-14
  • 打赏
  • 举报
回复
不清楚你调的函数,没法看,
另外代码发的太乱了
crystal8700 2010-04-28
  • 打赏
  • 举报
回复
再顶!
red-fly 2010-04-27
  • 打赏
  • 举报
回复
cv是啥玩意儿?我还没有听说过呢
crystal8700 2010-04-27
  • 打赏
  • 举报
回复
顶一个!
wilson_hz 2010-04-27
  • 打赏
  • 举报
回复
opencv,刚开始研究,目前答不出来,友情UP
maple_zhj 2010-04-27
  • 打赏
  • 举报
回复
参观参观。。。
niupanboy 2010-04-27
  • 打赏
  • 举报
回复
参观下!!!!!
Eleven 2010-04-26
  • 打赏
  • 举报
回复
囧。。。代码太长
xiuxianshen 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 crystal8700 的回复:]
引用 6 楼 littlefangmfc 的回复:
关于第2个问题,cvSetReal2D(img,0,39,233);
设置的是图片矩阵的第1行第38列,当然是坐标(39,0)了

谢谢!难道矩阵的坐标是列在前,行在后吗?
[/Quote]
确实有些问题,刚刚试了试,而且按照你的代码创建图像后的imageData的指针好像都有点问题,指针头的数据都不对,思考中
daredjever 2010-04-26
  • 打赏
  • 举报
回复
jiefen
taofa817 2010-04-26
  • 打赏
  • 举报
回复
顶。。。。
crystal8700 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 littlefangmfc 的回复:]
关于第2个问题,cvSetReal2D(img,0,39,233);
设置的是图片矩阵的第1行第38列,当然是坐标(39,0)了
[/Quote]
谢谢!难道矩阵的坐标是列在前,行在后吗?
littlefangMFC 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 crystal8700 的回复:]
引用 6 楼 littlefangmfc 的回复:
关于第2个问题,cvSetReal2D(img,0,39,233);
设置的是图片矩阵的第1行第38列,当然是坐标(39,0)了

谢谢!难道矩阵的坐标是列在前,行在后吗?
[/Quote]
不是列在前行在后,只不过矩阵中列的值是从左向右的,跟坐标系中X坐标的方向是一样的,行的值时从上向下的,跟坐标系中的Y坐标是一样的,你自己拿个图片画一个矩阵比划一下就知道了
Daniel_31 2010-04-26
  • 打赏
  • 举报
回复
。。。。。。。。。。。。。。。。。。。。。。
尹成 2010-04-25
  • 打赏
  • 举报
回复
友情帮顶
处处留心 2010-04-25
  • 打赏
  • 举报
回复
不习惯看代码。帮顶
charwei 2010-04-25
  • 打赏
  • 举报
回复
这个我也不清楚,友情帮顶
m_tornado 2010-04-25
  • 打赏
  • 举报
回复
看看~
littlefangMFC 2010-04-25
  • 打赏
  • 举报
回复
关于第2个问题,cvSetReal2D(img,0,39,233);
设置的是图片矩阵的第1行第38列,当然是坐标(39,0)了
ywwj5858792qd 2010-04-25
  • 打赏
  • 举报
回复
菜鸟目前看不懂,只能友情帮顶了
加载更多回复(1)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧