OpenCV绘制图像上某直线区域的RGB强度分布图

本文介绍了一个使用C++实现的基于鼠标操作的图像处理功能,包括绘制线条、获取像素坐标、在原图和新图中显示路径及RGB强度分布,并通过代码实现了将路径上像素的RGB值映射到另一个画布的连续分布图。

首先,不知道这篇博文的标题合不合适,呵呵,大家有没有更合适的标题呢。

这篇博文是在前两篇的基础上写的,大家可以参看一下。下面贴代码了。

[c-sharp] view plain copy print ?
  1. #include <cv.h>  
  2. #include <highgui.h>  
  3. #include <stdio.h>  
  4. #pragma comment( lib, "cv.lib" )  
  5. #pragma comment( lib, "cxcore.lib" ) 
  6. #pragma comment( lib, "highgui.lib" )   
  7. IplImage* org = 0;   
  8. IplImage* img = 0;   
  9. IplImage* tmp = 0;   
  10. IplImage* msk = 0;  
  11. IplImage* dst = 0 ;  
  12. void on_mouse( int eventint x, int y, int flags, void* ustc)  
  13. {  
  14.     static CvPoint pre_pt = {-1,-1};  
  15.     static CvPoint cur_pt = {-1,-1};  
  16.     CvFont font;  
  17.     cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA);  
  18.     char temp[16];  
  19.       
  20.     ifevent == CV_EVENT_LBUTTONDOWN )  
  21.     {  
  22.         cvCopy(org,img);  
  23.         sprintf(temp,"(%d,%d)",x,y);  
  24.         pre_pt = cvPoint(x,y);  
  25.         cvPutText(img,temp, pre_pt, &font, cvScalar(0,0, 0, 255));  
  26.         cvCircle( img, pre_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );  
  27.         cvShowImage( "image", img );  
  28.           
  29.         cvCopy(img,tmp);  
  30.     }  
  31.     else ifevent == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))  
  32.     {  
  33.         cvCopy(tmp,img);  
  34.         sprintf(temp,"(%d,%d)",x,y);  
  35.         cur_pt = cvPoint(x,y);        
  36.         cvPutText(img,temp, cur_pt, &font, cvScalar(0,0, 0, 255));  
  37.         cvLine(img, pre_pt, cur_pt, cvScalar(0,255,0,0), 1, CV_AA, 0 );  
  38.         cvShowImage( "image", img );  
  39.     }  
  40.     else ifevent == CV_EVENT_LBUTTONUP )  
  41.     {  
  42.         sprintf(temp,"(%d,%d)",x,y);  
  43.         cur_pt = cvPoint(x,y);        
  44.         cvPutText(img,temp, cur_pt, &font, cvScalar(0,0, 0, 255));  
  45.         cvCircle( img, cur_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );  
  46.         cvLine( img, pre_pt, cur_pt, cvScalar(0,255,0,0), 1, CV_AA, 0 );  
  47.         cvSetZero(msk);  
  48.         cvLine( msk, pre_pt, cur_pt, cvScalar(255,255,255,0), 1, CV_AA, 0 );  
  49.         cvShowImage( "image", img );  
  50.         int width=org->width;  
  51.         int height=org->height;  
  52.         int step=org->widthStep;  
  53.         uchar *data=(uchar*)org->imageData;  
  54.         int mask_step=msk->widthStep;  
  55.         uchar *mask_data=(uchar*)msk->imageData;  
  56.         cvSet(dst,cvScalar(255,255,255));  
  57.         int length=cvCeil(sqrt((pre_pt.x-cur_pt.x)*(pre_pt.x-cur_pt.x)+(pre_pt.y-cur_pt.y)*(pre_pt.y-cur_pt.y)));  
  58.         double bin_width=(double)dst->width/length;  
  59.         double bin_height=(double)dst->height/255;  
  60.         int count=0;  
  61.         for(int i=0;i<width;i++)  
  62.         {  
  63.             for(int j=0;j<height;j++)  
  64.             {  
  65.                 if(mask_data[j*mask_step+i]!=0)  
  66.                 {  
  67.                     CvPoint pt;  
  68.                     pt=cvPoint(bin_width*count,(dst->height-data[j*step+i*3+2])*bin_height);  
  69.                     cvCircle(dst, pt,1,cvScalar(0,0,255,0) ,CV_FILLED, CV_AA, 0 );  
  70.                     pt=cvPoint(bin_width*count,(dst->height-data[j*step+i*3+1])*bin_height);  
  71.                     cvCircle(dst, pt,1,cvScalar(0,255,0,0) ,CV_FILLED, CV_AA, 0 );  
  72.                     pt=cvPoint(bin_width*count,(dst->height-data[j*step+i*3])*bin_height);  
  73.                     cvCircle(dst, pt,1,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );  
  74.                     count++;  
  75.                 }             
  76.             }  
  77.         }  
  78.           
  79.         cvNamedWindow("dst",1);  
  80.         cvShowImage("dst",dst);  
  81.     }  
  82. }  
  83. int main()  
  84. {  
  85.     org=cvLoadImage("lena.jpg",1);  
  86.     img=cvCloneImage(org);  
  87.     tmp=cvCloneImage(org);  
  88.     msk=cvCreateImage(cvSize(img->width,img->height),8,1);  
  89.     cvSetZero(msk);  
  90.     dst=cvCreateImage(cvSize(400,300),8,3);  
  91.     cvSet(dst,cvScalar(255,255,255));  
  92.     cvNamedWindow("image",1);  
  93.     cvSetMouseCallback( "image", on_mouse, 0 );   
  94.     cvShowImage("image",img);     
  95.     cvWaitKey(0);   
  96.     cvDestroyAllWindows();  
  97.     cvReleaseImage(&org);  
  98.     cvReleaseImage(&img);  
  99.     cvReleaseImage(&tmp);  
  100.     cvReleaseImage(&msk);  
  101.     cvReleaseImage(&dst);  
  102.     return 0;  
  103. }  

效果图如下,上图是绘线窗口,下图是线上的RGB强度分布图。

 

这里离散的显示分布图,大家有没有方法使连续起来呢?

内容概要:本文聚焦于不计电池储能寿命损耗的微电网经济调度问题,提出了一种融合电价型、激励型及可中断负荷型三类需求侧响应机制的优化调度模型。研究基于Matlab平台构建了包含光伏、风机、储能系统等多种分布式能源的微电网运行成本最小化模型,详细阐述了目标函数与约束条件的数学建模过程,并通过仿真验证了所提策略在降低系统运行成本、实现削峰填谷和提升能源利用效率方面的有效性。该模型强调需求侧资源的灵活调控能力,为微电网的经济高效运行提供了理论支持和技术路径。; 适合人群:电力系统、能源互联网及相关专业的高校研究生、科研人员,以及从事微电网优化调度、综合能源系统规划与运行的工程技术人员。; 使用场景及目标:①用于教学科研中深入理解微电网经济调度的核心原理、建模方法与求解流程;②为实际微电网项目中整合多类型需求侧响应资源、制定优化运行策略提供可复现的仿真工具与技术参考;③作为进一步研究更复杂场景(如计入储能寿命损耗、碳排放约束、不确定性因素等)的优化模型的基础框架。; 阅读建议:读者应具备电力系统基础理论知识和Matlab编程能力,建议结合文中模型逐步复现代码,通过调整负荷曲线、能源价格、响应参数等变量进行敏感性分析,以深化对调度机制的理解。需特别注意,本模型未考虑电池寿命损耗这一关键因素,在实际工程应用中应结合电池老化模型进行补充和完善,以获得更贴近现实的调度方案。
内容概要:本文提出了一种考虑阶梯式碳交易与供需灵活双响应的综合能源系统优化调度模型,并通过Matlab代码实现。该模型深度融合了阶梯式碳交易机制与电力系统中需求侧及供给侧的灵活响应能力,构建了一个涵盖电、热、气等多种能源形式耦合的综合能源系统框架。通过引入阶梯碳价机制,有效激励系统低碳运行,同时结合需求响应与供给调整的协同优化策略,显著提升了系统运行的经济性与环保性。研究采用先进的数学优化方法对模型进行求解,实现了对系统内各能源单元出力、储能设备调度、负荷转移等关键变量的全局最优配置,为实现能源高效利用与碳排放最小化的双重目标提供了科学支撑。; 适合人群:具备电力系统、能源系统建模或优化调度等相关背景的科研人员与工程技术人员,特别适合从事综合能源系统规划、低碳调度策略、碳交易机制设计等方向研究的研究生及高校教师。; 使用场景及目标:①深入研究阶梯式碳交易机制在综合能源系统中的建模方法与应用效果;②实现供需双侧灵活互动下的系统经济性与低碳化协同优化调度;③为区域能源系统的低碳转型提供量化分析工具与决策支持依据;④作为Matlab平台下能源系统优化建模的教学案例或科研复现参考。; 阅读建议:建议读者结合提供的Matlab代码逐行解析模型构建过程,重点掌握目标函数与约束条件的数学建模逻辑及其程序实现方式。在学习过程中应积极尝试调整碳价阶梯参数、改变负荷响应场景以观察系统优化结果的变化,从而深化对模型机理的理解。同时,可将本模型与单一碳价或其他需求响应模型进行对比分析,进一步拓展研究视野与创新思路。
已经博主授权,源码转载自 https://pan.quark.cn/s/43c3d5a5f28a 在Web开发领域中,网站系统升级维护提示页面的构建与部署占据着至关重要的地位,特别是在系统进行更新操作或进行故障修复期间,为了确保用户操作的流畅性和数据的完整性,通常会运用到此类提示界面。一个名为"网站系统升级维护提示页面.rar"的归档文件内,收录了完成这一功能所必需的核心构成部分。其中,`index.html`文件作为网页的核心载体,负责构建页面的基本框架和呈现内容。针对当前的应用情境,`index.html`文件极有可能运用一种简约而雅致的布局设计,用以呈现"系统升级维护中"的状态信息。编程人员能够在这个文档中定位到展示企业标识和建设性升级提示的代码单元,并且可以依据实际需求进行个性化设置。 `css`目录中存放的是CSS(层叠样式表)文档,这些文档负责设定页面的视觉表现,涵盖色彩搭配、字体选用、页面布局以及响应式设计等多个方面。在系统升级维护的提示页面上,CSS样式或许已经预设了与整体风格相契合的色彩搭配和元素排布,以此保障页面的视觉吸引力和专业性。编程人员可以通过调整这些样式规范来优化页面的整体观感,使其与企业的品牌形象保持一致。 `images`目录则用于存储页面装饰或信息传递所需的图形素材。这些图形可能包含加载指示器、公司标识以及其他与系统升级维护相关的视觉符号。图形素材的挑选和设计对于信息的有效传递以及用户体验的提升具有决定性作用。编程人员可以根据实际需求进行图形素材的替换或增补,确保其与整体页面设计风格相吻合。 `js`目录内包含了JavaScript程序代码,这些代码负责处理页面的交互机制和动态表现。例如,JavaScript代码可能被用于实现计时功能,显...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值