#include <bits/stdc++.h>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
Mat src1,ROI,src2,dst,tmp;
int now_val=50;
void call_back(int,void*){
double percent=(double)now_val/100;
addWeighted(src1(Rect(0,0,300,300)),percent,src2(Rect(0,0,300,300)),1-percent,0,dst);
}
int main( ){
//1.读入图1拉出左上角100X100部分感兴趣区域遍历置绿色
src1=imread("1.jpg");
ROI=src1(Rect(0,0,100,100));
for(int i=0;i<ROI.rows;i++)
for(int j=0;j<ROI.cols;j++)
for(int k=0;k<3;k++){
ROI.at<Vec3b>(i,j)[k]=(k==1?255:0);
ROI.at<Vec3b>(i,j)[k]=(k==1?255:0);
ROI.at<Vec3b>(i,j)[k]=(k==1?255:0);
}
namedWindow("first");
imshow("first",src1);
//2.读入图2分离通道置距右下界大于100部分绿色合并通道
src2=imread("2.jpg");
vector<Mat> channel;
split(src2,channel);
for(int i=0;i<channel.size();i++)
for(int j=0;j<channel[i].rows;j++)
for(int k=0;k<channel[i].cols;k++)
channel[i].at<uchar>(j,k)=(i==0?255:0);
merge(channel,src2);
namedWindow("second");
imshow("second",src2);
//3.滑动条控制两图左上角500X500像素合成区域显示
namedWindow("third");
addWeighted(src1(Rect(0,0,300,300)),0.5,src2(Rect(0,0,300,300)),0.5,0,dst);
imshow("third",dst);
createTrackbar("mix","third",&now_val,100,call_back);
//4.复制输出图并画一个圆形和矩形
dst.copyTo(tmp);
line(tmp,Point2d(0,0),Point2d(200,200),Scalar(0,0,255));
circle(tmp,Point2d(250,250),100,Scalar(0,255,255));
namedWindow("fourth");
imshow("fourth",tmp);
//5.应用>进行二值化
Mat srcImage=imread("head.jpg", 0); imshow("原始图",srcImage);
srcImage = srcImage > 119;imshow( "取阈值后的原始图", srcImage );//一个符号解决二值化
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours( srcImage,contours,hierarchy,RETR_CCOMP,CHAIN_APPROX_SIMPLE);//关键代码
Mat dstImage = Mat::zeros(srcImage.rows, srcImage.cols, CV_8UC3);
for(int index = 0; index >= 0; index = hierarchy[index][0] ){
Scalar color( rand()&255, rand()&255, rand()&255 );
drawContours( dstImage, contours, index, color, FILLED, 8, hierarchy );//关键代码
}
imshow( "轮廓图", dstImage );
waitKey(0);
return(0);
}