MFC 界面设计

yaojun123456789 2010-04-15 02:53:20
想要做个界面,要完成功能的代码如下:
#include "iostream.h"
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include "cv.h"

#include "highgui.h"
#include "cxcore.hpp"
IplImage* src=NULL;
IplImage* bin=NULL;
IplImage* bing=NULL;
IplImage* psrc=NULL;
IplImage* dst=NULL;
#define max_corners 100
int thresh=134;
void on_trackbar(int thresh)
{
cvThreshold(psrc,bing,thresh,255,CV_THRESH_BINARY_INV);

cvShowImage("bing",bing);
}

main()

{
double scale=0.46;
int mode=CV_RETR_EXTERNAL;//提取轮廓模式
int contours_num=0,contours_nums=0;//提取的轮廓数目
// CvScalar external_color;//绘制轮廓线的颜色
CvMemStorage* storage=cvCreateMemStorage(0);
CvSeq* contour=0;//存储提取轮廓的序列指针
CvSize bin_cvsize;
CvSize bing_cvsize;
CvSize psrc_cvsize;

src=cvLoadImage("020.jpg",-1);
bin_cvsize.width=(int)(src->width*scale);
bin_cvsize.height=(int)(src->height*scale);
bin=cvCreateImage(bin_cvsize,src->depth,src->nChannels);
cvResize(src,bin,CV_INTER_LINEAR);
cvNamedWindow("bin",CV_WINDOW_AUTOSIZE);
cvShowImage("bin",bin);
dst=cvLoadImage("020.jpg",0);
bing_cvsize.width=(int)(dst->width*scale);
bing_cvsize.height=(int)(dst->height*scale);
bing=cvCreateImage(bing_cvsize,dst->depth,dst->nChannels);
cvResize(dst,bing,CV_INTER_LINEAR);
psrc_cvsize.width=(int)(dst->width*scale);
psrc_cvsize.height=(int)(dst->height*scale);
psrc=cvCreateImage(psrc_cvsize,dst->depth,dst->nChannels);
cvResize(dst,psrc,CV_INTER_LINEAR);
cvNamedWindow("bing",CV_WINDOW_AUTOSIZE);
cvCreateTrackbar("threshold","bing",&thresh,255,on_trackbar);// 滚动条设置
on_trackbar(thresh);
cvWaitKey(0);//等待按键
IplImage *Rol,*Rol_gray;//定义中间指针,指向感兴趣的区域
CvRect rect;//定义一个矩形,用来记录轮廓的矩形区域

//找到外轮廓
cvFindContours(bing,storage,&contour,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
for(;contour;contour=contour->h_next)
{
int x,y;
if(contour->total<300)
continue;
//标记箱体区域
cvDrawContours(bin,contour,CV_RGB(255,0,0),CV_RGB(255,0,0),0,1,8,cvPoint(0,0));
//显示标记后的图像
cvNamedWindow("markImage",CV_WINDOW_AUTOSIZE);
cvShowImage("markImage",bin);
rect= ((CvContour*)contour)->rect;
cvSetImageROI(bin,rect);
Rol = cvCreateImage( cvSize(rect.width, rect.height), bin->depth, bin->nChannels );
Rol_gray = cvCreateImage( cvSize(rect.width, rect.height), bing->depth, bing->nChannels );

cvCopy(bin,Rol);

cvNamedWindow( "Rol", CV_WINDOW_AUTOSIZE ); //创建窗口
cvShowImage( "Rol", Rol); //显示图像
cvWaitKey(0); //等待按键
cvDestroyWindow( "markImage" );
cvDestroyWindow( "Rol" );

}
cvCvtColor(Rol,Rol_gray,CV_BGR2GRAY);//将彩色图转灰度图

//以固定阈值将图像二值化
cvThreshold(Rol_gray,Rol_gray,120,255, CV_THRESH_BINARY );
//有rent得到矩形的四角的坐标
CvPoint pt1, pt2;
pt1.x = rect.x;
pt1.y = rect.y;
pt2.x = rect.x + rect.width;
pt2.y = rect.y + rect.height;

//将rol区分割成12个部分,以便确定各个物体的位置
cvRectangle(Rol_gray,cvPoint(0,0),cvPoint(rect.width,0.34*rect.height),cvScalar(255,255,255),1);
cvRectangle(Rol_gray,cvPoint(0,0),cvPoint(rect.width,0.67*rect.height),cvScalar(255,255,255),1);
cvRectangle(Rol_gray,cvPoint(0,0),cvPoint(rect.width,rect.height),cvScalar(255,255,255),1);

cvRectangle(Rol_gray,cvPoint(0,0),cvPoint(0.25*rect.width,rect.height),cvScalar(255,255,255),1);
cvRectangle(Rol_gray,cvPoint(0,0),cvPoint(0.5*rect.width,rect.height),cvScalar(255,255,255),1);
cvRectangle(Rol_gray,cvPoint(0,0),cvPoint(0.75*rect.width,rect.height),cvScalar(255,255,255),1);

cvNamedWindow( "Rolgray", 1 ); //创建窗口
cvShowImage( "Rolgray", Rol_gray); //显示图像
int i,j,k,sum = 0;

int height,width,step,Channels;

height=Rol_gray->height;
width=Rol_gray->width;
step =Rol_gray->widthStep;

uchar *data = (uchar*)Rol_gray->imageData;

for(i=0;i<0.34*height;i++) for(j=0;j<0.25*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1200)
printf("(1,1)位置缺");
sum = 0;

for(i=0;i<0.34*height;i++) for(j=0.25*width;j<0.5*width;j++)
{
if(data[i*step+j]>200)
sum++;

}
if(sum<1100)
printf("(1,2)位置缺");
sum = 0;

for(i=0;i<0.34*height;i++) for(j=0.5*width;j<0.75*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1000)
printf("(1,3)位置缺");
sum = 0;

for(i=0;i<0.34*height;i++) for(j=0.75*width;j<width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1200)
printf("(1,4)位置缺");
sum = 0;

for(i=0.34*height;i<0.67*height;i++) for(j=0;j<0.25*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1100)
printf("(2,1)位置缺");
sum = 0;

for(i=0.34*height;i<0.67*height;i++) for(j=0.25*width;j<0.5*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1000)
printf("(2,2)位置缺");
sum = 0;

for(i=0.34*height;i<0.67*height;i++) for(j=0.5*width;j<0.75*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1000)
printf("(2,3)位置缺");
sum = 0;

for(i=0.34*height;i<0.67*height;i++) for(j=0.75*width;j<width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1100)
printf("(2,4)位置缺");
sum = 0;

for(i=0.67*height;i<height;i++) for(j=0;j<0.25*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1200)
printf("(3,1)位置缺");
sum = 0;

for(i=0.67*height;i<height;i++) for(j=0.25*width;j<0.5*width;j++)
{
if(data[i*step+j]>200)
sum++;

}
if(sum<1100)
printf("(3,2)位置缺");
sum = 0;

for(i=0.67*height;i<height;i++) for(j=0.5*width;j<0.75*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1100)
printf("(3,3)位置缺");
sum = 0;

for(i=0.67*height;i<height;i++) for(j=0.75*width;j<width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<2300)
printf("(3,4)位置缺");
cvWaitKey(0);
cvDestroyWindow( "Rolgray" );
cvDestroyWindow("src");
cvDestroyWindow("dst");
cvReleaseImage(&src);
cvReleaseImage(&psrc);
cvReleaseImage(&bin);
cvReleaseImage(&dst);
cvReleaseMemStorage(&storage);
return 0;

}

想做成如下的界面:

按下打开按钮。在左上角图像控件中显示原图:

按下二值化按钮,能得到下面带滚动条的图像,改变滚动条能显示相应阈值下的二值图。(就是这个老出错,解决不了)
向编辑框输入0-255之间的数字,按下检测按钮,根据输入的阈值,得到检测结果,显示在左下编辑框内,如:

最后按下保存结果按钮,将结果保存到excel里。
谢谢大家帮忙解决一下!!!
...全文
828 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
susgua 2010-04-17
  • 打赏
  • 举报
回复
学习了~~~~~~~~~~~~
无·法 2010-04-16
  • 打赏
  • 举报
回复
貌似好高级啊 向高手们学习!
ronghaoyue 2010-04-16
  • 打赏
  • 举报
回复
void __cdecl on_trackbar(int thresh){...}
yaojun123456789 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 wilson_hz 的回复:]
适合的话,记得把分给我哦!
[/Quote]
你发的这个代码我也有,我要加个按钮啊,
每次运行cvCreateTrackbar("threshold","bing",&thresh,255,on_trackbar);// 滚动条设置
就出现错误error C2664: 'cvCreateTrackbar' : cannot convert parameter 5 from 'void (int)' to 'void (__cdecl *)(int)'
不知道怎么改,我自己定义的on_trackbar函数是:
void on_trackbar(int thresh)
{
cvThreshold(psrc,bing,thresh,255,CV_THRESH_BINARY_INV);

cvShowImage("bing",bing);
}

还是要说声谢谢!
yaojun123456789 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 wilson_hz 的回复:]
已经发你邮箱了,注意查收!
[/Quote]
zhangxin357 2010-04-16
  • 打赏
  • 举报
回复
1.这就是MFC的一个标准界面,没有什么特别的,可以用对话框来实现
2.显示图像你可以用Picture控件,也可以直接画Dialog上
3.就是一个slide控件的问题,在其相应的消息响应函数中处理就是了
4.excel操作的例子网上很多,通过com接口很容易实现
wilson_hz 2010-04-16
  • 打赏
  • 举报
回复
适合的话,记得把分给我哦!
wilson_hz 2010-04-16
  • 打赏
  • 举报
回复
已经发你邮箱了,注意查收!
wilson_hz 2010-04-15
  • 打赏
  • 举报
回复
明天去公司了传给你哈,我家里没有,不好意思。
k81348 2010-04-15
  • 打赏
  • 举报
回复
看个热闹
yaojun123456789 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 visualeleven 的回复:]
你那个是CSliderCtrl控件吗?
[/Quote]
不是
yaojun123456789 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wilson_hz 的回复:]
OpenCV,我也是刚刚开始学习这个,不过我手上有你要的类似的源码,需要的话流个邮箱,或者给我发个消息好了,我传给你。
[/Quote]
gaolingbo2@163.com
谢谢
wilson_hz 2010-04-15
  • 打赏
  • 举报
回复
OpenCV,我也是刚刚开始学习这个,不过我手上有你要的类似的源码,需要的话流个邮箱,或者给我发个消息好了,我传给你。
Eleven 2010-04-15
  • 打赏
  • 举报
回复
你那个是CSliderCtrl控件吗?
FireBirdCN 2010-04-15
  • 打赏
  • 举报
回复
WM_SCROLL
yaojun123456789 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 littlefangmfc 的回复:]
你的图片处理用的是OpenCV的库吧,你的意思是不会做那个滑动条吗
[/Quote]
恩,是的
yaojun123456789 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xianglitian 的回复:]
引用 10 楼 yaojun123456789 的回复:
想让帮忙解决的是滚动条的那个


那你这个出了什么问题啊?
[/Quote]
cvCreateTrackbar("threshold","bing",&thresh,255,on_trackbar);
用这个的时候,on_trackbar调不出来,网上说是程序是先调用this函数,除非你自己写滚动条函数解决。不会
littlefangMFC 2010-04-15
  • 打赏
  • 举报
回复
你的图片处理用的是OpenCV的库吧,你的意思是不会做那个滑动条吗
向立天 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yaojun123456789 的回复:]
想让帮忙解决的是滚动条的那个
[/Quote]

那你这个出了什么问题啊?
yaojun123456789 2010-04-15
  • 打赏
  • 举报
回复
想让帮忙解决的是滚动条的那个
加载更多回复(9)

15,980

社区成员

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

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