opencv学习(五)书本《学习Opencv》(中文版)第四章的作业答案第一题(opencv3.0.0+VS2012+win7)

需要注意的问题:

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;  
      
}  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值