OpenCV后投影,利用阈值函数分割指定区域生成掩膜,通过直方图分布查找其他图像相同区域。

一、API函数

void mixChannels(const Mat* src,int nsrc,Mat* dst ,int ndst,const int* fromTo,size_t npairs);
1、**&hsv:**要从中复制通道的源数组
2、1:源数组的数量
3、**&hue:**复制的频道的目标数组
4、1:目标数组的数量
5、ch [] = {0,0}:指示通道如何复制的索引对数组。在这种情况下,&hsv的Hue(0)通道正被复制到0通道的6、&Hue(1通道),
7、1:索引对数
void cv::calcBackProject 
(
const Mat * images, 
int nimages,
const int * channels,
InputArray hist,
OutputArray backProject,
const float ** ranges, 
double scale = 1,
bool uniform = true
)
1、const Mat* images:输入图像,图像深度必须位CV_8U,CV_16U或CV_32F中的一种,尺寸相同,每一幅图像都可以有任意的通道数 
2、int nimages:输入图像的数量 
3、const int* channels:用于计算反向投影的通道列表,通道数必须与直方图维度相匹配
4、InputArray hist:输入的直方图,直方图的bin可以是密集(dense)或稀疏(sparse) 
5、OutputArray backProject:目标反向投影输出图像,是一个单通道图像,与原图像有相同的尺寸和深度 
6、const float ranges**:直方图中每个维度bin的取值范围 
7、double scale=1:可选输出反向投影的比例因子 

二、程序


#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;

int main(int, char** argv)
{
    Mat src;
    //利用阈值函数分割指定区域生成掩膜,通过直方图分布查找其他图像相同区域
    Mat src1 = imread("2.png");
    imshow("原图", src1);
    threshold(src1, src, 235, 255, 4);
    
    Mat hsv, h,hist,back;
    if (src.empty())
    {
        cout << "未输入图像" << endl;
        return -1;
    }
    cvtColor(src, hsv, COLOR_BGR2HSV);
    //分离H通道
    h.create(hsv.size(), hsv.depth());
    int ch[] = { 0, 0 };
    mixChannels(&hsv, 1, &h, 1, ch, 1);
    //等价于split函数
   /* vector<Mat>mv;
    split(hsv, mv);
    h = mv[0];*/

    Mat dst, dh, dhsv;
    flip(src1, dst, -1);
    imshow("实验图", dst);
    cvtColor(dst, dhsv, COLOR_BGR2HSV);
    //分离H通道
    dh.create(dhsv.size(), dhsv.depth());
    int ch1[] = { 0, 0 };
    mixChannels(&dhsv, 1, &dh, 1, ch1, 1);

    int histSize = 8;
    float hue_range[] = { 0, 180 };
    const float* ranges = { hue_range };
    calcHist(&h, 1, 0, Mat(), hist, 1, &histSize, &ranges, true, false);
    normalize(hist, hist, 0, 255, NORM_MINMAX, -1);
    calcBackProject(&dh, 1, 0, hist, back, &ranges, 1, true);
    imshow("back", back);

    waitKey(0);
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹿( ﹡ˆoˆ﹡ )

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值