【练习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 }

结果图像:

【练习4.1】图像转换、Canny检测、图像合并、在图像上输出文字

时间: 2024-10-09 20:12:02

【练习4.1】图像转换、Canny检测、图像合并、在图像上输出文字的相关文章

[图像]Canny检测的Matlab实现(含代码)

原创文章,欢迎转载.转载请注明:转载自 祥的博客 原文链接:http://blog.csdn.net/humanking7/article/details/46606791 图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值. Canny边缘检测基本特征如下: (1) 必须满足两个条件:①能有效地抑制噪声:②必须尽量精确确定边缘的位置. (2) 根据对信噪比与定位乘积进行测度,得到最优化逼近算

paper 27 :图像/视觉显著性检测技术发展情况梳理(Saliency Detection、Visual Attention)

1. 早期C. Koch与S. Ullman的研究工作. 他们提出了非常有影响力的生物启发模型. C. Koch and S. Ullman . Shifts in selective visual attention: Towards the underlying neural circuitry. Human Neurobiology, 4(4):219-227, 1985. C. Koch and T. Poggio. Predicting the Visual World: Silenc

图像肤色初步检测实现

肤色检测输出结果中有许多瑕疵,待于进一步处理(如:滤波操作.....).在此贴出几种图像肤色检测相关代码,供大家参考. 第一种:RGB color space // skin region location using rgb limitation void ImageSkin::ImageSkinRGB(IplImage* rgb,IplImage* _dst) { assert(rgb->nChannels==3&& _dst->nChannels==3); static

Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理

1.1. 图像边缘一般都是通过对图像进行梯度运算来实现的1 1.2. Remark: 1 1.3.  1.失焦检测. 衡量画面模糊的主要方法就是梯度的统计特征,通常梯度值越高,画面的边缘信息越丰富,图像越清晰.1 1.4. 利用边缘检测 ,模糊图片边缘会较少2 1.5. 通过dct比较.Dct分离出的低频信号比较2 1.6. 参考资料2 1.1. 图像边缘一般都是通过对图像进行梯度运算来实现的 1.2. Remark:   1)肉眼可以分辨以上五幅图像的质量排名为:img42 > img81 >

图像格式转换——合理使用工具的重要性以及常用图像转换工具分析

最近需要批量将PNM格式的文件转换成GIF文件.我尝试了如下的图像转换工具: ImageBatch:完全免费,但仅仅支持PNG JPEG BMP GIF四种格式 OfficeConverter:在线转换软件,支持所有图像格式的相互转换,大量处理图像时需要支付一定费用,否则效率低 Pixillion:支持所有格式,试用版仅仅最多支持5个文件为一组batch的处理,使用100次以后必须付费使用 由于上述工具均不能满足我的需要(不想使用付费软件),我尝试搜索PNM转GIF文件的软件包,发现可以安装Py

kinect2.0 基础篇第3篇 用C#在Visual Studio上编写把深度图像转换成彩色图像

本示例实现的功能有:有两个Radiobutton控件  选一个,点击启动按钮, 第一个是将深度图像转换成彩色图像 第二个是将深度图像做一些简单处理(例如太暗的调白一点) 涉及到一点遥感图像处理知识,将深度数据值转换为色调和饱和度 遥感图像处理那块不懂,有兴趣的自己可以研究研究,代码的基于kinect1的教程,慢慢尝试出来的,虽然功能实现了,但是原理还不是很懂 <Window x:Class="EnhancedDepthWPF.MainWindow" xmlns="htt

OCR文字识别软件中怎么把图像转换成HTML

之前给大家介绍了使用OCR文字识别软件ABBYY FineReader Mac版将PDF转换成HTML文档(详见PDF转换成HTML文档首选ABBYY Mac),其实ABBYY FineReader无论Mac版还是Windows版都可以实现这一点,除此之外还可以将图像文件转换成HTML文档,本文具体讲讲这一功能. ABBYY FineReader是一款OCR图文识别软件,当前最新版本为ABBYY FineReader 12,可快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜

&lt;p&gt;&lt;span style=&quot;font-size:14px&quot;&gt;近期须要批量将PNM&amp;#26684;式的文件转换成GIF文件。我尝试了例如以下的图像转换工具:&lt;/span&gt;&lt;/p&gt;

近期须要批量将PNM格式的文件转换成GIF文件.我尝试了例如以下的图像转换工具: ImageBatch:全然免费,但只支持PNG JPEG BMP GIF四种格式 OfficeConverter:在线转换软件,支持全部图像格式的相互转换.大量处理图像时须要支付一定费用,否则效率低 Pixillion:支持全部格式,试用版只最多支持5个文件为一组batch的处理,使用100次以后必须付费使用 因为上述工具均不能满足我的须要(不想使用付费软件),我尝试搜索PNM转GIF文件的软件包,发现能够安装Py

Opencv 读取视频,随播放滚动的视频条,canny检测。

实现视频条的拖动需要使用全局变量g_slider_position,和回调函数onTrackbarSlider(). 拖动条由函数cvCreateTrackbar()函数产生,具体调用为: 1 cvCreateTrackbar("position", 2 "Original", 3 &g_slider_position, 4 frames, 5 onTrackbarSlider); 6 } “position” 为拖动条名称,“Original”为显示窗口名