《学习OpenCV》练习题第四章第三题b
- #include <highgui.h>
- #include <cv.h>
- #include "opencv_libs.h"
- /*
- *《学习OpenCV》第四章第三题b
- * 完成时间:1:36 3/31 星期日 2013
- */
- /* 矩形框 */
- CvRect rect;
- bool draw = false; // 标记是否在画
- IplImage* img;
- IplImage * temp;
- IplImage * original;
- bool draw_hist = false;
- IplImage* getHistImage(IplImage* image, CvHistogram* image_hist,
- CvSize image_size, CvScalar value)
- {
- // 计算直方图
- cvCalcHist( &image, image_hist, , NULL );
- // 新建一幅3通道的图像
- IplImage* dst = cvCreateImage(image_size, IPL_DEPTH_8U, );
- cvSet( dst, cvScalarAll() );
- float max_value = ;
- cvGetMinMaxHistValue( image_hist, NULL, &max_value, NULL, NULL );
- double bin_width = (double)dst->width/;
- double bin_unith = (double)dst->height/max_value; // 高度比例
- for(int i = ; i < ; i++)
- {
- // 获得矩形左上角和右下角坐标
- CvPoint p0 = cvPoint( i + bin_width, dst->height );
- CvPoint p1 = cvPoint( (i+) * bin_width,
- dst->height - cvGetReal1D(image_hist->bins, i) * bin_unith );
- // 画实心矩形
- cvRectangle( dst, p0, p1, value, -, , );
- }
- return dst;
- }
- void draw_rect(IplImage* img, CvRect rect)
- {
- cvRectangle( img,
- cvPoint( rect.x, rect.y ),
- cvPoint( rect.x + rect.width, rect.y + rect.height),
- cvScalar( 0x00, 0x00, 0xff) );
- printf("draw\n");
- // 在这里处理直方图
- // 设置感兴趣区域
- cvSetImageROI( img, rect);
- IplImage* src_rect = cvCreateImage (
- cvSize( rect.width, rect.height ),
- img->depth, img->nChannels );
- cvCopy(img, src_rect );
- cvResetImageROI( img );
- IplImage* r_img = cvCreateImage( cvGetSize( src_rect),
- src_rect->depth, );
- IplImage* g_img = cvCreateImage( cvGetSize( src_rect),
- src_rect->depth, );
- IplImage* b_img = cvCreateImage( cvGetSize( src_rect),
- src_rect->depth, );
- IplImage* gray_img = cvCreateImage( cvGetSize( src_rect),
- src_rect->depth, );
- // 分离RGB分量
- cvSplit( src_rect, r_img, g_img, b_img, NULL);
- cvShowImage( "red", r_img);
- cvShowImage( "green", g_img);
- cvShowImage( "blue", b_img);
- // 灰度转换
- cvCvtColor( src_rect, gray_img, CV_BGR2GRAY);
- int size = ;
- float range[] = {, };
- float* ranges[] = {range};
- // 创建直方图
- CvHistogram * r_hist = cvCreateHist( , &size, CV_HIST_ARRAY, ranges, );
- CvHistogram * g_hist = cvCreateHist( , &size, CV_HIST_ARRAY, ranges, );
- CvHistogram * b_hist = cvCreateHist( , &size, CV_HIST_ARRAY, ranges, );
- CvHistogram * gray_hist = cvCreateHist( , &size, CV_HIST_ARRAY, ranges, );
- // 直方图尺寸
- CvSize image_size = cvSize( , );
- IplImage* r_dst = getHistImage(r_img, r_hist, image_size, cvScalar(0x00, 0x00, 0xff));
- IplImage* g_dst = getHistImage(g_img, g_hist, image_size, cvScalar(0x00, 0xff, 0x00));
- IplImage* b_dst = getHistImage(b_img, b_hist, image_size, cvScalar(0xff, 0x00, 0x00));
- IplImage* gray_dst = getHistImage( gray_img, gray_hist, image_size, cvScalar() );
- // 把四个直方图在一幅图片上显示出来
- IplImage* dst = cvCreateImage( cvSize( image_size.width * , image_size.height * ), , );
- cvSetZero( dst );
- // 拷贝红色分量直方图
- CvRect r_rect = cvRect( , , image_size.width, image_size.height);
- cvSetImageROI(dst, r_rect);
- cvCopy( r_dst, dst);
- // 拷贝绿色分量直方图
- CvRect g_rect = cvRect(image_size.width, , image_size.width, image_size.height );
- cvSetImageROI( dst, g_rect);
- cvCopy( g_dst, dst);
- // 蓝色分量
- CvRect b_rect = cvRect(, image_size.height, image_size.width, image_size.height );
- cvSetImageROI(dst, b_rect);
- cvCopy( b_dst, dst );
- // 灰度分量
- CvRect gray_rect = cvRect( image_size.width, image_size.height,
- image_size.width, image_size.height );
- cvSetImageROI( dst, gray_rect);
- cvCopy( gray_dst, dst);
- cvResetImageROI( dst );
- cvShowImage( "src", src_rect);
- cvShowImage( "dst", dst );
- cvWaitKey();
- cvDestroyAllWindows();
- cvReleaseImage( &r_img );
- cvReleaseImage(&g_img);
- cvReleaseImage(&b_img);
- cvReleaseImage(&gray_img);
- cvReleaseImage(&r_dst);
- cvReleaseImage(&g_dst);
- cvReleaseImage(&b_dst);
- cvReleaseImage(&gray_dst);
- cvReleaseImage(&src_rect);
- cvReleaseImage(&dst);
- }
- // 鼠标回调函数
- void my_mouse_callback( int event, int x, int y, int flags, void* param)
- {
- IplImage* image = (IplImage*) param;
- switch( event )
- {
- case CV_EVENT_MOUSEMOVE:
- {
- if(draw)
- {
- rect.width = x - rect.x;
- rect.height = y - rect.y;
- }
- draw_hist = false;
- }
- break;
- case CV_EVENT_LBUTTONDOWN:
- {
- draw = true;
- rect = cvRect( x, y, , );
- draw_hist = false;
- }
- break;
- case CV_EVENT_LBUTTONUP:
- {
- draw = false;
- draw_hist = true;
- if(rect.width < )
- {
- rect.x += rect.width;
- rect.width *= -;
- }
- if(rect.height < )
- {
- rect.y += rect.height;
- rect.height *= -;
- }
- // draw
- draw_rect(image, rect);
- }
- break;
- // 在右键按下时清除
- case CV_EVENT_RBUTTONDOWN:
- cvCopyImage(original, img);
- printf("clear.\n");
- break;
- }
- }
- int main()
- {
- img = cvLoadImage( "lena.bmp", );
- rect = cvRect( -, -, , );
- // 副本
- temp = cvCloneImage( img );
- original = cvCloneImage(img);
- cvNamedWindow("draw rect");
- cvSetMouseCallback("draw rect", my_mouse_callback, (void*)img);
- while()
- {
- cvCopyImage(img, temp);
- if(draw_hist)
- {
- draw_rect( temp , rect );
- }
- cvShowImage( "draw rect", temp);
- if(cvWaitKey() == )
- break;
- }
- cvReleaseImage(&img);
- cvReleaseImage(&temp);
- cvDestroyAllWindows();
- return ;
- }
运行结果:
不足:在源图像上用鼠标选择矩形区域的时候,无法实时地在图像上反映出来。
《学习OpenCV》练习题第四章第三题b的更多相关文章
- 《学习OpenCV》练习题第四章第三题a
#include <highgui.h> #include <cv.h> #include "opencv_libs.h" #pragma comment ...
- 《学习OpenCV》练习题第四章第八题ab
这道题是利用OpenCV例子程序里自带的人脸检测程序,做点图像的复制操作以及alpha融合. 说明:人脸检测的程序我参照了网上现有的例子程序,没有用我用的OpenCV版本(2.4.5)的facedet ...
- 《学习OpenCV》练习题第四章第七题abc
题外话:一直是打算把这本书的全部课后编程题写完的,中间断了几个月,一直忙于其他事.现在开始补上. 这道题我不清楚我理解的题意是不是正确的,这道题可以练习用OpenCV实现透视变换(可以用于矫正在3维环 ...
- OpenCV实现的高斯滤波探究_1(《学习OpenCV》练习题第五章第三题ab部分)
首先看下OpenCV 官方文档对于cvSmooth各个参数的解释: Smooths the image in one of several ways. C: void cvSmooth(const C ...
- 《学习OpenCV》 第四章 习题六
实现的是一个图像标签编辑器,其间遇到了些问题还未解决或者可能解决方法上不是最优,若你有更好的思路可以提供给我,大恩不言谢啦!!☆⌒(*^-゜)v. #include "stdafx.h&qu ...
- 《学习OpenCV》练习题第四章第一题b&c
#include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...
- 《学习OpenCV》练习题第四章第二题
#include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...
- 《学习OpenCV》练习题第四章第一题a
#include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...
- 学习opencv中文版教程——第二章
学习opencv中文版教程——第二章 所有案例,跑起来~~~然而并没有都跑起来...我只把我能跑的都尽量跑了,毕竟看书还是很生硬,能运行能出结果,才比较好. 越着急,心越慌,越是着急,越要慢,越是陌生 ...
随机推荐
- 谈谈map中的count方法
map和set两种容器的底层结构都是红黑树,所以容器中不会出现相同的元素,因此count()的结果只能为0和1,可以以此来判断键值元素是否存在(当然也可以使用find()方法判断键值是否存在). 拿m ...
- Java NIO读书笔记
一.Java IO与NIO区别: (1)Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO ...
- No resource found that matches the given name
XML里面明显已经定义了ID,可是android:layout_toLeftOf="@id/text_seller"报错,说没有定义,原来这玩意要写在相对位置对象声明的下面,是有顺 ...
- hdu 4405 Aeroplane chess(简单概率dp 求期望)
Aeroplane chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- eclipse中字母大小写转换快捷键
ctrl+shift+x 转为大写 ctrl+shift+y 转为小写
- GUI for git|SourceTree|入门基础
原文链接:http://www.jianshu.com/p/be9f0484af9d 目录 SourceTree简介 SourceTree基本使用 SourceTree&Git部分名词解释 相 ...
- PHP学习笔记02——简易计算器
<!DOCTYPE html> <html> <head> <title>PHP简易计算器</title> </head> &l ...
- 长期演进技术(LTE,Long Term Evolution)
/********************************************************************************* * 长期演进技术(LTE,Long ...
- hihoCoder #1174 : 拓扑排序·一 (判断循环图)
G++ 261ms 13MB 题意: 给出n门课程的修读所需要的前置课程的关系,按理说应该是个拓扑图,但是因为某些原因导致了混乱,所以有可能不是一个拓扑图.现在的问题是,判断该图是否为一个拓扑图(即无 ...
- ios协议调起app
function openIos(url, callback) { if (!url) { return; } var node = document.createElement('iframe'); ...