需要注意的问题:
1.文字标签必须在显示图像之前放上去
2.如何将几个图粘起来,origin和widthstep的用法
3.如何显示文字
源码:
#include "cv.h"
#include "highgui.h"
int main(int argc, char** argv)
{
CvCapture* capture = cvCreateFileCapture(argv[1]);
cvNamedWindow("origin",CV_WINDOW_AUTOSIZE);
cvNamedWindow("gray",CV_WINDOW_AUTOSIZE);
cvNamedWindow("canny",CV_WINDOW_AUTOSIZE);
cvNamedWindow("totle", CV_WINDOW_AUTOSIZE);
CvSize size = cvSize((int)cvGetCaptureProperty(capture,
CV_CAP_PROP_FRAME_WIDTH),
(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT));
IplImage* gray = cvCreateImage(size,IPL_DEPTH_8U,1);
IplImage* gray3 = cvCreateImage(size,IPL_DEPTH_8U,3);//三通道灰度图像
IplImage* cannyImage = cvCreateImage(size,IPL_DEPTH_8U,1);
IplImage* cannyImage3 = cvCreateImage(size,IPL_DEPTH_8U,3);//三通道canny图像
//size.width = size.width*3;
IplImage* totle = cvCreateImage(cvSize(size.width*3,size.height),IPL_DEPTH_8U, 3);
cvZero(totle);
while (1)
{
IplImage* frame = cvQueryFrame(capture);
if (!frame)
{
return -1;
}
cvShowImage("origin",frame);
cvConvertImage(frame,gray,1);//变为灰度,1代表垂直旋转
cvShowImage("gray",gray);
//做canny运算
if (gray->nChannels != 1)
{
break;
}
cvCanny(gray,cannyImage,100,150,3);//下限阈值,上限阈值,中孔=3
cvShowImage("canny",cannyImage);
IplImage* img1 = cvCreateImageHeader(size,frame->depth,3);//全变三通道
IplImage* img2 = cvCreateImageHeader(size,frame->depth,3);
IplImage* img3 = cvCreateImageHeader(size,frame->depth,3);
img1->origin = frame->origin;//坐标原点的位置可以是两取值,左上角或左下角
img1->widthStep = totle->widthStep;//相邻行的同列点之间的字节数
//这里注意,因为img1要成为在大图中的一部分,所以是大图每行字节长
img2->origin = frame->origin;
img2->widthStep = totle->widthStep;
img3->origin = frame->origin;
img3->widthStep = totle->widthStep;
cvCvtColor(gray,gray3,CV_GRAY2BGR);
cvCvtColor(cannyImage,cannyImage3,CV_GRAY2BGR);
//imageData包含一个指向第一行图像数据的指针
img1->imageData = totle->imageData; //第一个指向大图的开始处,即第一行
cvCopy(frame,img1);
img2->imageData = (totle->imageData) + (frame->widthStep);
相邻行的同列点之间的字节数因此从第一行第一个到第二行第一个有多少字节就知道了
//这里很关键,注意字节排列问题,所以不能用width
cvCopy(gray3,img2);
img3->imageData = totle->imageData + 2*frame->widthStep;
cvCopy(cannyImage3,img3);
CvFont font = cvFont(10.0,1);
cvInitFont(&font,CV_FONT_HERSHEY_SCRIPT_SIMPLEX,0.5f,0.5f);
//void cvInitFont(CvFont* font,int font_face,
//double hscale全高或半高1或0.5,double vscale,double shear斜体0不斜 = 0,
//int thickness = 1,int line_type = 8);
cvPutText(totle,"Frame",cvPoint(size.width/2,size.height/2),&font,cvScalar(0,0,255));
//void cvPutText(CvArr* img,const char* text,
//CvPoint origin文本框左下角位置,const CvFont* font,CvScalar color);
cvPutText(totle,"Frame_gray",cvPoint(size.width/2*3,size.height/2),&font,cvScalar(0,0,255));
cvPutText(totle,"Frame_canny",cvPoint(size.width/2*5,size.height/2),&font,cvScalar(0,0,255));
cvShowImage("totle",totle);//最后再显示
char c = cvWaitKey(33);
if (c == 27)
{
break;
}
}
cvReleaseCapture(&capture);
cvReleaseImage(&gray);
cvReleaseImage(&cannyImage);
cvReleaseImage(&totle);
cvReleaseImage(&gray3);
cvReleaseImage(&cannyImage3);
cvDestroyAllWindows();
return 0;
}