程序
#include “stdafx.h”
//本节讲述 图像处理之 canny边缘检测相关知识;
#include <opencv2/opencv.hpp>
#include
#include <math.h>
using namespace std;
using namespace cv;
Mat src, dst, dst1, dst2, dst3, dst4, dst6, dst5, gray_src;
const char*output_title = “canny双阈值处理”;
char input_title[] = “原图”;
int main(int argc, char**argv)
{
src = imread(“C:/Users/Rubison.DELL/Desktop\杂物/壁纸/荔枝.jpg”); //存放自己图像的路径
dst = imread(“C:/Users/Rubison.DELL/Desktop\杂物/壁纸/小白2.jpg”); //存放自己图像的路径
if (!src.data)
{
printf(“could not load image…\r\n”);
return -1;
}
namedWindow(input_title, CV_WINDOW_AUTOSIZE);
imshow(input_title, src);
//imshow("图2", dst);
cvtColor(dst,gray_src,CV_BGR2GRAY);
//cvtColor(src, src, CV_BGR2GRAY);
threshold(gray_src, gray_src,127,255,THRESH_TOZERO);
imshow("灰度", gray_src);
Mat roi = src(Rect(0, 0, dst.cols, dst.rows)); //画矩形!!Rect(x,y,width,height),x, y 为左上角坐标, width, height 则为长和宽。
imshow("检测roi111", roi);
//imshow("结果2", src);
Mat mask(roi.rows, roi.cols, roi.depth(), Scalar(1)); //全黑的图片 当()中为0时,不显示重叠图中对应的roi部分 只看第一通道
//imshow("检测mask", mask);
gray_src.copyTo(roi, gray_src);
//imshow("检测dst", dst);
//imshow("检测roi222", roi);
imshow("结果", src); //经过dst.copyTo,为什么src改变了呢? 原因1:roi和src共用一个内存
//src.copyTo(dst);
//imshow("简单Copy",src);
waitKey(0);
destroyAllWindows();
return 0;
}
运行结果
补充
图一结果:是简单的进行copyTo函数提取感兴趣区域,但是遇到一些问题:
1.为什么dst.copyTo(roi, gray_src);后,输出src图就变成叠加?<因为roi是用Rect()函数在src上生成的,他只是显示src局部的一部分图,且与src共用一个内存,copyTo等函数处理了roi后,显示src就可以看到整体效果>
2.如果将小白图转灰度,处理后叠加在src上,不显示叠加?只有同时将src也转换为灰度图才能叠加。
<将单通道图加在彩色图上,好像没变化,为什么呢?按道理单通道像素叠加也会改变像素值,彩色图多少也会有变换呀?有待解答,希望看到的朋友帮忙解答下>
知识点:
1.A.copyTo(roi,mask)处理时,当mask中像素为0时,不显示A图片中的像素,否则将A图片对应点像素叠加在roi上。
2.补充:A.copyTo(B):将A拷贝到B区域
3.补充: 参考链接-关于CopyTo函数需要注意的点