mfc顶用opencv在主对话框中用按键响应在新建的对话框中显示图片
mfc中用opencv在主对话框中用按键响应在新建的对话框中显示图片
我之前用mfc基于对话框写了一个线程,通过一个按键来显示处理过的图片,之前用的是cvnamewindow建的窗口,现在由于需要所迫要把处理过图片通过一个对话框中显示出来,不用cvnamewindow我知道可以通过pictue控件显示,但现在的问题是我的一切函数,线程,变量都在主对话框里,现在不知道怎样才能达到目的,还请大家多多指教
这是我的图片处理函数
void CtestDlg::imagerunhs(IplImage* img)
{
const char *showwindow = "imvishow";
IplImage *mo;
if(img)
{
mo = cvLoadImage("e:\1.jpg",1);
cvNamedWindow(showwindow,0);
cvSetImageROI(mo,cvRect(426,682,426,341));
cvResize(img,mo,CV_INTER_AREA);
cvResetImageROI(mo);
cvFlip(img,NULL, -1);
cvSetImageROI(mo,cvRect(426,0,426,341));
cvResize(img,mo,CV_INTER_AREA);
cvResetImageROI(mo);
IplImage * dst = 0;
dst = cvCloneImage (img);
double delte = 1.0;
double factor = 1.0;
float m[6];//factor = (cos(angle*CV_PI/180.) + 1.1)*3;
CvMat M = cvMat( 2, 3, CV_32F, m );
int w = img->width;
int h = img->height;
m[0] = (float)(factor*cos(-135*2*CV_PI/180.));
m[1] = (float)(factor*sin(-135*2*CV_PI/180.));
m[2] = w*0.5f;
m[3] = -m[1];
m[4] = m[0];
m[5] = h*0.5f;
cvZero (dst);
cvGetQuadrangleSubPix( img, dst, &M);
*img = *dst;
cvSetImageROI(mo,cvRect(852,341,426,341));
cvResize(img,mo,CV_INTER_AREA);
cvResetImageROI(mo);
cvFlip(img,NULL, 1);
cvSetImageROI(mo,cvRect(0,341,426,341));
cvResize(img,mo,CV_INTER_AREA);
cvResetImageROI(mo);
cvShowImage(showwindow,mo);
cvWaitKey(0);
cvReleaseImage(&img);
cvReleaseImage(&mo);
}
}
为了线程之间的参数传递我新建了个结构体
struct PARAMATER
{
CString path;
CRect rect;
HDC hdc;
};
这是我的线程函数:
UINT CtestDlg::imagerun(LPVOID IpParamater)
{
CtestDlg *pDlg2 = (CtestDlg*)IpParamater;//为了使用类函数,指针传递
IplImage * img;
CString filename = ((PARAMATER*)IpParamater)->path; //path为传递打开图片的路径
const char *path=filename.GetBuffer(sizeof(filename));
img = cvLoadImage(path,1);
pDlg2->imagerunhs(img);//调用图片处理函数
return 0;
}
现在我新建对话框了个对话框,id为IDD_DIALOG1,类为show,后面不知道怎么办,不知道在哪里改变什么??谢谢了
------解决方案--------------------
有一个c++的最大话函数,,用在你的对话框初始化,就可以了
我之前用mfc基于对话框写了一个线程,通过一个按键来显示处理过的图片,之前用的是cvnamewindow建的窗口,现在由于需要所迫要把处理过图片通过一个对话框中显示出来,不用cvnamewindow我知道可以通过pictue控件显示,但现在的问题是我的一切函数,线程,变量都在主对话框里,现在不知道怎样才能达到目的,还请大家多多指教
这是我的图片处理函数
void CtestDlg::imagerunhs(IplImage* img)
{
const char *showwindow = "imvishow";
IplImage *mo;
if(img)
{
mo = cvLoadImage("e:\1.jpg",1);
cvNamedWindow(showwindow,0);
cvSetImageROI(mo,cvRect(426,682,426,341));
cvResize(img,mo,CV_INTER_AREA);
cvResetImageROI(mo);
cvFlip(img,NULL, -1);
cvSetImageROI(mo,cvRect(426,0,426,341));
cvResize(img,mo,CV_INTER_AREA);
cvResetImageROI(mo);
IplImage * dst = 0;
dst = cvCloneImage (img);
double delte = 1.0;
double factor = 1.0;
float m[6];//factor = (cos(angle*CV_PI/180.) + 1.1)*3;
CvMat M = cvMat( 2, 3, CV_32F, m );
int w = img->width;
int h = img->height;
m[0] = (float)(factor*cos(-135*2*CV_PI/180.));
m[1] = (float)(factor*sin(-135*2*CV_PI/180.));
m[2] = w*0.5f;
m[3] = -m[1];
m[4] = m[0];
m[5] = h*0.5f;
cvZero (dst);
cvGetQuadrangleSubPix( img, dst, &M);
*img = *dst;
cvSetImageROI(mo,cvRect(852,341,426,341));
cvResize(img,mo,CV_INTER_AREA);
cvResetImageROI(mo);
cvFlip(img,NULL, 1);
cvSetImageROI(mo,cvRect(0,341,426,341));
cvResize(img,mo,CV_INTER_AREA);
cvResetImageROI(mo);
cvShowImage(showwindow,mo);
cvWaitKey(0);
cvReleaseImage(&img);
cvReleaseImage(&mo);
}
}
为了线程之间的参数传递我新建了个结构体
struct PARAMATER
{
CString path;
CRect rect;
HDC hdc;
};
这是我的线程函数:
UINT CtestDlg::imagerun(LPVOID IpParamater)
{
CtestDlg *pDlg2 = (CtestDlg*)IpParamater;//为了使用类函数,指针传递
IplImage * img;
CString filename = ((PARAMATER*)IpParamater)->path; //path为传递打开图片的路径
const char *path=filename.GetBuffer(sizeof(filename));
img = cvLoadImage(path,1);
pDlg2->imagerunhs(img);//调用图片处理函数
return 0;
}
现在我新建对话框了个对话框,id为IDD_DIALOG1,类为show,后面不知道怎么办,不知道在哪里改变什么??谢谢了
------解决方案--------------------
有一个c++的最大话函数,,用在你的对话框初始化,就可以了