例3-13设置ROI
写在前面,写的时候总有种给别人写的感觉,然后就写得很冗长,也没有办法很好的表达自己的想法,总觉得写得越多越好,实则不然,要最言简意赅,还能表达意思。
嗯!
只写自己不明白的地方,如果恰巧有人也看了我的随笔,并且有所收获那就很幸运.[如果有歧义的地方,希望可以留言讨论]
好了 闲言碎语不要讲了,马上开始自己的下一个笔记:
上一个笔记,做了一个ROI region of interest。那个采用的是opencv里面提供好的函数:
分别是cvSetImageROI() 和 cvResetImageROI() 两个函数。
这一次依旧是设置兴趣区域,不过方法不同。
两种方式的区别在于,第一个只能设置一个矩阵的感兴趣区域。
而后面一个 可以设置多个感兴趣区域。
改版一:
#include "highgui.h"
#include "cv.h"
IplImage* src; void funcCvSetImageROI(){
cvNamedWindow("e3", );//0是可变大小,1是固定大小且与内容适配
int x = ;
int y = ;
int width = ;
int height = ;
CvRect interestRect = cvRect(x, y, width, height);
IplImage* interestImg;
interestImg = cvCreateImage(cvSize(interestRect.width, interestRect.height), , );
cvSetImageROI(src, interestRect);
cvAddS(src, cvScalar(, , , ), src);
cvResetImageROI(src);
cvShowImage("e3", src);
//cvWaitKey(0);
} void funcCvSetImageROI2(void){
//cvNamedWindow("e4", 1);
//src = cvLoadImage("1.png");这句话关键在上一次的结果会被保留到这一次,也就是说这次加完以后就全白了。POINT
IplImage* subImage = cvCreateImageHeader(cvSize(, ), , );
subImage->widthStep = src->widthStep;
subImage->imageData = src->imageData + * src->widthStep + * src->nChannels;
cvAddS(subImage, cvScalar(, , , ), subImage);
cvShowImage("e4", src);
cvWaitKey();
cvDestroyAllWindows();
}
int main(){
src = cvLoadImage("1.png");
funcCvSetImageROI();
funcCvSetImageROI2();
return ;
}
POINT
由点得到的想法是:既然可以叠加,那么是不是只用原来的函数就可以完成,多个兴趣区域的选择:
尝试:
在调用不同函数时:可以完成多个兴趣区域的选择:
void funcCvSetImageROI(){
cvNamedWindow("e3", );//0是可变大小,1是固定大小且与内容适配
int x = ;
int y = ;
int width = ;
int height = ;
CvRect interestRect = cvRect(x, y, width, height);
IplImage* interestImg;
interestImg = cvCreateImage(cvSize(interestRect.width, interestRect.height), , );
cvSetImageROI(src, interestRect);
cvAddS(src, cvScalar(, , , ), src);
cvResetImageROI(src);
cvShowImage("e3", src);
//cvWaitKey(0);
}
void funcCvSetImageROI_1(){
cvNamedWindow("e3", );//0是可变大小,1是固定大小且与内容适配
int x = ;
int y = ;
int width = ;
int height = ;
CvRect interestRect = cvRect(x, y, width, height);
IplImage* interestImg;
interestImg = cvCreateImage(cvSize(interestRect.width, interestRect.height), , );
cvSetImageROI(src, interestRect);
cvAddS(src, cvScalar(, , , ), src);
cvResetImageROI(src);
cvShowImage("e5", src);
cvWaitKey();
cvDestroyAllWindows();
}
主函数顺序调用:
funcCvSetImageROI
funcCvSetImageROI_1
可显示两片区域
如果换一种方式:
void funcCvSetImageROI_2(){
//cvNamedWindow("e3", 1);//0是可变大小,1是固定大小且与内容适配
int x = ;
int y = ;
int width = ;
int height = ;
CvRect interestRect1 = cvRect(x, y, width, height);
IplImage* interestImg;
interestImg = cvCreateImage(cvSize(interestRect1.width, interestRect1.height), , );
cvSetImageROI(src, interestRect1);
cvSetImageROI(src, cvRect(, , , ));
cvAddS(src, cvScalar(, , , ), src);
cvResetImageROI(src);
cvShowImage("e5", src);
cvWaitKey();
cvDestroyAllWindows();
}
直接调用此函数,则第一次兴趣区域丢失。
cvSetImageROI(src, interestRect1);
cvAddS(src, cvScalar(, , , ), src);
cvSetImageROI(src, cvRect(, , , ));
cvAddS(src, cvScalar(, , , ), src);
若如此则,全部保留。
这是因为第一次设置完兴趣区域以后,什么操作也没有做,然后就有直接设置了第二个兴趣区域,所以在加色之后,只有的后面设置的被填充粉色。所以如果后面再有兴趣区域的操作需要在设置完成之后立刻对齐进行操作。比如加色。
本段需要说明的是 图片·widthStep = 图片·width*nChannels。
subImage->imageData = src->imageData + 50 * src->widthStep + 50 * src->nChannels;
子图片指针 = 原图图片的首地址+50*行占字节数【对于3通道来说,就是rgb三个字节*图片宽度表示一行,如果是单通道就是灰度值一个字节*图片宽度,完成图片从上到下的偏移量】+50*图片的通道数完成从左边到右边的偏移量
测试代码:
#include "highgui.h"
#include "cv.h"
IplImage* src; void funcCvSetImageROI(){
cvNamedWindow("e3", );//0是可变大小,1是固定大小且与内容适配
int x = ;
int y = ;
int width = ;
int height = ;
CvRect interestRect = cvRect(x, y, width, height);
IplImage* interestImg;
interestImg = cvCreateImage(cvSize(interestRect.width, interestRect.height), , );
cvSetImageROI(src, interestRect);
cvAddS(src, cvScalar(, , , ), src);
cvResetImageROI(src);
cvShowImage("e3", src);
//cvWaitKey(0);
}
void funcCvSetImageROI_1(){
cvNamedWindow("e3", );//0是可变大小,1是固定大小且与内容适配
int x = ;
int y = ;
int width = ;
int height = ;
CvRect interestRect = cvRect(x, y, width, height);
IplImage* interestImg;
interestImg = cvCreateImage(cvSize(interestRect.width, interestRect.height), , );
cvSetImageROI(src, interestRect);
cvAddS(src, cvScalar(, , , ), src);
cvResetImageROI(src);
cvShowImage("e5", src);
cvWaitKey();
cvDestroyAllWindows();
}
void funcCvSetImageROI_2(){
//cvNamedWindow("e3", 1);//0是可变大小,1是固定大小且与内容适配
int x = ;
int y = ;
int width = ;
int height = ;
CvRect interestRect1 = cvRect(x, y, width, height);
IplImage* interestImg;
interestImg = cvCreateImage(cvSize(interestRect1.width, interestRect1.height), , );
cvSetImageROI(src, interestRect1);
cvAddS(src, cvScalar(, , , ), src);
cvSetImageROI(src, cvRect(, , , ));
cvAddS(src, cvScalar(, , , ), src);
cvResetImageROI(src);
cvShowImage("e5", src);
cvWaitKey();
cvDestroyAllWindows();
} void funcCvSetImageROI2(void){
//cvNamedWindow("e4", 1);
//src = cvLoadImage("1.png");这句话关键在上一次的结果会被保留到这一次,也就是说这次加完以后就全白了。
IplImage* subImage = cvCreateImageHeader(cvSize(, ), , );
subImage->widthStep = src->widthStep;
subImage->imageData = src->imageData + * src->widthStep + * src->nChannels;
cvAddS(subImage, cvScalar(, , , ), subImage);
cvShowImage("e4", src);
cvWaitKey();
cvDestroyAllWindows();
}
int main(){
src = cvLoadImage("1.png");
//funcCvSetImageROI();
funcCvSetImageROI_2();
return ;
}
学习代码:原来这个同学的blog感觉。。。并不太好。。。而且这个地方并不叫增加像素吧,虽然书上也是这么写的。。。增加对应通道的rgb数值使其完成颜色的变化或者对于单通道图片来说是灰度值的变化。。。
但我的确借鉴了。以下学习代码:以及最小可用代码片段:
#include <cv.h>
#include <highgui.h> int main()
{
IplImage* interest_img = cvLoadImage("screen.png"); CvRect interest_rect = cvRect(, , , );
IplImage* sub_img = cvCreateImageHeader(cvSize(, ), , ); //sub_img->origin = interest_img->origin;这个设置不设置都是一样的,可能为了适配更多的系统吧毕竟有的原点不在左上角。 sub_img->widthStep = interest_img->widthStep;//
//std::cout << interest_img->width;//图片的宽
//std::cout << interest_img->widthStep;// 图片的宽*nChannels ,单通道时等于width。 sub_img->imageData = interest_img->imageData + *interest_img->widthStep + *interest_img->nChannels; cvAddS(sub_img, cvScalar(), sub_img);
//cvShowImage("之后", sub_img);
cvShowImage(" interest_img", interest_img);
cvWaitKey();
cvReleaseImageHeader(&sub_img);
cvReleaseImage(&interest_img);
return ;
}
原来同学代码位置:
http://blog.csdn.net/shangyt/article/details/5747017
例3-13设置ROI的更多相关文章
- 【opencv学习笔记】SetImageROI函数设置ROI区域的作用及用法
虽然先前知道ROI区域是感兴趣区域,但是真正看到调用了OpenCV的cvSetImageROI函数时,并不知道它的作用,所以还是单独写了一段代码对这个函数进行探究. OpenCVchm文档中对cv ...
- 关于opencv中cv::Mat设置roi
opencv中设置roi实验: cv::Mat SrcImg; SrcImg = cv::imread("../resource/cpw3.png"); cv::imshow(&q ...
- 例3-12opencv设置ROI感兴趣区域
前面说了一堆,也不知道啥用,感觉也没说清楚,可能确实需要一些例子来显性表示一下,或者他们在当初出版书籍针对的人群已经有了对图像的基本认识,然而自己还是没有建立起来,往后看看吧,希望能比较清楚的自己处理 ...
- opencv——设置ROI区域
#include "stdafx.h" #include<opencv2\opencv.hpp> #include<opencv\cv.h> #includ ...
- Linux 权限设置
一.文件和目录权限 在Linux系统中,用户可以对每一个文件或目录都具有访问权限,这些访问权限决定了谁能访问,以及如何访问这些文件和目录. 1.文件权限简介 在Linux系统中,每一位用户都有对文件或 ...
- DEV控件:gridControl常用属性设置(转载)
特别长,先撸下来再说 1.隐藏最上面的GroupPanel gridView1.OptionsView.ShowGroupPanel=false; 2.得到当前选定记录某字段的值 sValue=T ...
- DEV控件:gridControl常用属性设置
1.隐藏最上面的GroupPanel gridView1.OptionsView.ShowGroupPanel=false; 2.得到当前选定记录某字段的值 sValue=Table.Rows[g ...
- DEV控件GridControl常用属性设置
1. 如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 2. 如何新增一条记录 (1).gridView.Ad ...
- [zt] ROI (Region of Interest) 感兴趣区域 OpenCV
在以前介绍IplImage结构的时候,有一个重要的参数——ROI.ROI全称是”Region Of Interest”,即感兴趣的区域.实际上,它是IPL/IPP(这两个是Inter的库)结构IplR ...
随机推荐
- SQL注入攻击的种类和防范手段
观察近来的一些安全事件及其后果,安全专家们已经得到一个结论,这些威胁主要是通过SQL注入造成的.虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施. ...
- Path类型的扩展方法 z
写了一个基于System.IO.Path类型方法的扩展类型,用于快速对文件系统路径进行操作.如下图: 其中有许多方法就是直接调用Path类型的静态方法.比如AppendPath方法内部会直接调用Pat ...
- Android学习笔记:TabHost 和 FragmentTabHost
TabHost 命名空间: android.widget.TabHost 初始化函数(必须在addTab之前调用): setup(); 包含两个子元素: 1.Tab标签容器TabWidget(@and ...
- r语言入门资料
最近有好多r语言的爱好者问我r语言的事情,在百度上简单的收一收,感觉都在扯淡,真正适合初学者入门的资料几乎没有,比如最开始用什么编辑器比较好,在哪下载,最开始学习的例子有什么? 在日本网站上反倒是找 ...
- HW6.25
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- Vmware Ubuntu 虚拟机与Windows主机共享文件夹
概述: 1.安装Vmware tool 2.设置共享文件夹并选择总是连接 3.运行命令挂载共享文件夹 前两步很简单,第三步在root权限下运行命令:mount -t vmhgfs .host:/ /m ...
- 成功在BAE上部署ghost 5.0
这周摸索着网站的建设,终于在今天成功上线!这里要谢谢ghost中文网和群里的网友,他的博客在这opengiser.他们的帮助太重要了.现在把过程记录下来,共同学习.试运营地址在edwardesire. ...
- ubuntukylin提取root权限及mongoDB部署
UbuntuKylin下安装Mongodb (参照UbuntuKylin下安装Mongodb一文安装成功后的心得) 1.官网下载安装包 http://www.mongodb.org/dr/fastd ...
- Android实例-MediaPlayer播放音乐和视频(XE8+小米2)
结果: 1.播放视频需要手动放入MediaPlayerControl1控件,设置MediaPlayerControl1.MediaPlayer := MediaPlayer1; 2.播放声音文件正常, ...
- nyoj 975 关于521
关于521 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去. 浏览网页的流年忽然看到了网上有人用玫 ...