opencv2(2017.5.3)

1.cv::Mat有若干成员函数可以获取图像属性,at(int y,int x)可以用来存取图像元素,但是必须知道图像数据类型!

例:


image.at<cv::Veb3b>(j,i)[channel]=value;//彩色图像,其中channel注明了颜色通道号;```

类似的,open cv 还有二元,四元向量;

```cv::Mat_<uchar>im2=image;

im2(50,100)=0;//存取第50行,100列//重载了运算符()```

##2.使用指针遍历图像(使用双重循环遍历所有的像素值)

颜色缩减函数:

void colorReduce(cv::Mat&image,int div=64)
{
int n1=image.rows;//行数

    int nc=image.cols*image.channels();//每行的元素个数

    for(int j=0;j<n1;j++)//得到第j行的首地址

   {

        uchar* data=image.ptr<uchar>(j);//ptr可以得到任意行的首地址,此处返回第j行的首地址

        for(int i=0;i<nc;i++)

       {
          //处理每一个像素 
         data[i]=data[i]/div*div+div/2

       }//像素处理完成

   }//行处理完成

}```

主函数:


image=cv::imread("boldt.jpg");

//处理图像(调用函数)

colorReduce(image);

//显示图像

cv::namedWindow("image");

cv::imshow("image",image);```

#3.使用迭代器遍历彩色图像

void colorReduce(cv::Mat &image,int div=64)

{

    cv::Mat_<cv::Vec3b>::iterator it=image.begin<cv::Vec3b>();//得到起始位置的迭代器

    cv::Mat_<cv::Veb3b>::iterator itend=image.end<cv::Veb3b>();//得到终止位置的迭代器

   for(;it!=itend;++it)

  {//处理每个像素

           (*)it[0]=(*)it[0]/div*div+div/2;

           (*)it[1]=(*)it[1]/div*div+div/2;

           (*)it[2]=(*)it[2]/div*div+div/2;

  }

} ```

4.使用卷积核进行滤波,编写图像锐化函数

void sharpen2D(const cv::Mat &image,cv::Mat &result)

{

       cv::Mat kernel(3,3,CV_32f,cv::Scalar(0));//构造核,所有的项初始化为0

       //对核元素赋值

       kernel.at<float>(1,1)=5.0;

       kernel.at<float>(1,0)=-1.0;

       kernel.at<float>(1,2)=-1.0;

       kernel.at<float>(0,1)=-1.0;

       kernel.at<float>(2,1)=-1.0;

//对图像进行滤波

cv::filter2D(image,result,image.depth(),kernel);

}```

#5.进行简单的图像运算(此处仅针对两个输入图像具有相同尺寸)

(1)加、减、乘、除        

cv::add(image1,w1,image2,w2,b,result) ——> open cv2 里面对运算符进行了重载,可以直接写符号: result=0.7image1+0.9image2

cv::substract 、cv::absdiff、cv::multiply、cv::divide```

(2)位运算符

cv::bitwise_and、cv::bitwise_or 、cv::bitwise_xor 、cv::bitwise_not

(3)找矩阵最大最小值、矩阵的一些运算

cv::max、 cv::min、矩阵求逆m1.inv()、矩阵转置m1.t()、矩阵的行列式m1.determinate()、向量模v1.norm()、向量叉乘v1.cross(v2)、向量点乘v1.cross(v2)

(4)只接受一个输入的操作符

cv::sqrt、 cv::pow 、cv::abs 、cv::cuberoot 、cv::exp 、cv::log

6.对图像的一个通道进行操作后,再合并

//创建一个图像向量

std::vector<cv::Mat>planes;

//将一个三通道图像分离成三个单通道图像

cv::spirit(image,planes);```

//将新图层叠加到蓝色通道

planes[0]+=image2;

//将三个单通道图像合并为一个三通道图像

cv::merge(planes,result);```

7.定义感兴趣区域ROI(此处针对两张图像具有不同大小尺寸,比如想在原图像上加一个logo)

只要ROI大小和logo图片大小一致,则可以调用cv::add;ROI位置决定了logo图像被插入的位置;

//定义图像ROI

cv::Mat imageROI;//ROI与他的父图像指向同一块内存缓冲区

imageROI=image(cv::Rect(385,270,logo.cols,logo.rows))或者imageROI=image(cv::Range(270,270+logo.rows),cv::Range(385,385+logo.cols))

//插入logo                                                                                          或    //加载掩模(必须是灰度图)

cv::addWeighted(imageROI,1.0,logo,0.3,0.,imageROI)              cv::Mat mask=cv::imread("logo.bmp",0)   //此处0代表灰度图像

                                                                                                         //通过掩模拷贝ROI

                                                                                                        logo.copyTo(imageROI,mask)```

8.类的设计

class ColorDetector{

private:

 int minDist;  //最小可接受距离

 cv::Vec3b  target;//目标色

 cv::Mat result;//结果图像

 //构造函数

ColorDetector():minDist(100){

   target[0]=target[1]=target[2]=0; //初始化默认参数

}

//设置颜色距离阈值,阈值必须是正,否则设为0

void setColorDistanceThreshold(int distance){

 if(distance<0)   distance=0;

 minDist=distance;

}

//获取颜色距离阈值

int getColorDistanceThreshold() const{

 return minDist;

}

//设置需检测的颜色

void setTargetColor(unsigned char blue,unsigned char green,unsigned char red){

 target[0]=blue;    arget[1]=green;    target[2]=red;

}

//获取需检测的颜色

cv::Vec3b getTargetColor() const{

 return target;

}

cv::Mat ColorDetctor::process(const cv::Mat &image){

 result.create(image.rows,image.cols,CV_8U);//按需重新分配二值图像,与输入图像的尺寸相同,但只有一个通道

//得到迭代器

cv::Mat_<cv::Vec3b>::const_iterator it=image.begin<cv::Vec3b>();

cv::Mat_<cv::Vec3b>::const_iterator itend=image.end<cv::Vec3b>();

cv::Mat_<unchar>::iterator itout=result.begin<unchar>();

//遍历每个像素

for(;it!=itend;++it,++itout){

 if(getDistance(*it)<minDist)     *itout=255;

 else  *itout=0;

}

 return result;

}

//计算与目标颜色的距离

int getDistance(const cv::Vec3b& color)const{

 return abs(color[0]-target[0])+abs(color[1]-target[1])+abs(color[2]-target[2]);

}

}

int main(){

 //1.创建图像处理对象

 ColorDetector cdetect;

 //2.读取输入图像

 cv::Mat image=cv::imread("1.jpg");

 if(!image.data)

 return 0;

 //3.设置输入参数

 cdetect.setTargetColor(130,190,230);//蓝天的颜色

 cv::namedwindow("result");

 //4.处理并显示结果

 cv::imshow("result",cdetect.process(image))

 cv::waitkey();

 return 0;

}```

9.控制器实现类之间的通信

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容