zoukankan      html  css  js  c++  java
  • 【练习4.1】图像转换、Canny检测、图像合并、在图像上输出文字

    2014-07-17

    第四章 细说HighGUI

    练习题第1题

    题目大致要求:

    a:(1)从视频文件读入数据,(2)转换为灰度图,(3)做Canny边缘检测,显示在三个窗口

    b:将a的三个视频显示在一个窗口中

    c:在b步骤的不同部分写上合适的文字标签

    代码:

      1 #include "stdafx.h"
      2 #include <windows.system.h>
      3 #include <iostream>
      4 #include <cv.h>
      5 #include <highgui.h>
      6 using namespace std;
      7 using namespace cv;
      8 
      9 int _tmain(int argc, _TCHAR* argv[])
     10 {
     11     const char * videoFileName = "D:\Work\Work_Programming\Source\Video\Fork.avi";
     12 
     13     cvNamedWindow("原始视频", 0);
     14     cvNamedWindow("灰度视频", 0);
     15     cvNamedWindow("Canny视频", 0);
     16     cvNamedWindow("三合一视频", 0);
     17 
     18     CvCapture * videoCapture = cvCreateFileCapture(videoFileName);
     19     int imgWidth = (int)cvGetCaptureProperty(videoCapture, CV_CAP_PROP_FRAME_WIDTH);
     20     int imgHeight = (int)cvGetCaptureProperty(videoCapture, CV_CAP_PROP_FRAME_HEIGHT);
     21     IplImage * frame;
     22 
     23     IplImage * grayImage = cvCreateImage(cvSize(imgWidth, imgHeight), IPL_DEPTH_8U, 1);
     24     IplImage * cannyImage = cvCreateImage(cvSize(imgWidth, imgHeight), IPL_DEPTH_8U, 1);
     25     IplImage * tripleImage = cvCreateImage(cvSize(imgWidth * 3, imgHeight), IPL_DEPTH_8U, 3);
     26     IplImage *tempImage = cvCreateImage(cvSize(imgWidth, imgHeight), IPL_DEPTH_8U, 3);
     27 
     28     IplImage *subFrameImage = cvCreateImageHeader(cvSize(imgWidth, imgHeight), IPL_DEPTH_8U, 3);
     29     IplImage *subGrayImage = cvCreateImageHeader(cvSize(imgWidth, imgHeight), IPL_DEPTH_8U, 3);
     30     IplImage *subCannyImage = cvCreateImageHeader(cvSize(imgWidth, imgHeight), IPL_DEPTH_8U, 3);
     31 
     32     //--------------------c在图片上显示文字-----------------------    
     33     CvFont ft;
     34     cvInitFont(&ft, CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0, 0, 2, 8);
     35 
     36     while (true)
     37     {
     38         frame = cvQueryFrame(videoCapture);
     39 
     40         if (!frame)
     41         {
     42             break;
     43         }
     44 
     45         //--------------------a(1)小题-----------------------         
     46         cvShowImage("原始视频", frame);
     47 
     48         //--------------------a(2)小题-----------------------    
     49         cvCvtColor(frame, grayImage, CV_BGR2GRAY);
     50         cvShowImage("灰度视频", grayImage);
     51 
     52         //--------------------a(3)小题-----------------------
     53         if (grayImage->nChannels != 1)
     54         {
     55             return 0;
     56         }
     57 
     58         cvCanny(grayImage, cannyImage, 50, 100, 3);
     59         cvShowImage("Canny视频", cannyImage);
     60 
     61         //--------------------b:将三个视频在一个窗口中显式-----------------------
     62         //将原始图像复制到三合一窗口
     63         subFrameImage->origin = tripleImage->origin;
     64         subFrameImage->widthStep = tripleImage->widthStep;
     65         subFrameImage->imageData = tripleImage->imageData;
     66 
     67         cvPutText(frame, "Original", cvPoint(0, 20), &ft, cvScalar(255, 255, 255));
     68 
     69         cvCopy(frame, subFrameImage);
     70 
     71         //将灰度图复制到三合一窗口
     72         subGrayImage->origin = tripleImage->origin;
     73         subGrayImage->widthStep = tripleImage->widthStep;
     74         subGrayImage->imageData = tripleImage->imageData + (subFrameImage->width)*subFrameImage->nChannels;
     75         cvCvtColor(grayImage, tempImage, CV_GRAY2BGR);
     76 
     77         cvPutText(tempImage, "Gray", cvPoint(0, 20), &ft, cvScalar(255, 255, 255));
     78 
     79         cvCopy(tempImage, subGrayImage);
     80 
     81         //将Canny复制到三合一窗口
     82         subCannyImage->origin = tripleImage->origin;
     83         subCannyImage->widthStep = tripleImage->widthStep;
     84         subCannyImage->imageData = tripleImage->imageData + (subFrameImage->width * 2)*subFrameImage->nChannels;
     85         cvCvtColor(cannyImage, tempImage, CV_GRAY2BGR);
     86 
     87         cvPutText(tempImage, "Canny", cvPoint(0, 20), &ft, cvScalar(255, 255, 255));
     88 
     89         cvCopy(tempImage, subCannyImage);
     90 
     91         cvShowImage("三合一视频", tripleImage);
     92 
     93         char c = cvWaitKey(33);
     94         if (c == 27)
     95         {
     96             break;
     97         }
     98     }
     99 
    100     cvReleaseImage(&grayImage);
    101     cvReleaseImage(&cannyImage);
    102     cvReleaseImage(&tripleImage);
    103     cvReleaseImage(&tempImage);
    104 
    105     cvReleaseImageHeader(&subFrameImage);
    106     cvReleaseImageHeader(&subGrayImage);
    107     cvReleaseImageHeader(&subCannyImage);
    108     cvReleaseCapture(&videoCapture);
    109     cvDestroyWindow("原始视频");
    110     cvDestroyWindow("灰度视频");
    111     cvDestroyWindow("Canny视频");
    112     cvDestroyWindow("三合一视频");
    113 
    114     //system("pause");
    115 
    116     return 0;
    117 }

    结果图像:

    ‖==========钟于原创 乐于分享 宁静致远 毋忆典藏==========‖
  • 相关阅读:
    脱发
    jquery radio 选择值
    今天看了非诚勿扰记忆哥,觉得人和人还是差的是能力
    如果要在数组中删除东西还是用倒序的数是正确的
    jquery操作 xml
    偶然在一个帖子上看到的
    jquery 队列的应用
    阅读
    Request的getParameter和getAttribute方法的区别
    jsp与jspx文件
  • 原文地址:https://www.cnblogs.com/tingshuixuan2012/p/OpenCVExercises4_1.html
Copyright © 2011-2022 走看看