【问题标题】:OpenCV Image substraction signed outputOpenCV 图像减法签名输出
【发布时间】:2016-08-09 14:38:48
【问题描述】:

我想减去两个灰度图像(CV_8UC1)并得到它们的符号差作为结果(CV_16SC1)。

我已经尝试了下面的代码,但我得到了一个 CV_8UC1 矩阵的差异,该矩阵插入了一个签名的 CV_16SC1。

能否请您帮忙正确定义 Mask 矩阵和数据类型参数?

谢谢!

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include "Imagesubstraction.h"

using namespace cv;
using namespace std;


int main(void)
{


Mat M1, M2,Dif;

    M1 = imread("../data/difference/a.bmp", CV_LOAD_IMAGE_GRAYSCALE);
    M2 = imread("../data/difference/b.bmp", CV_LOAD_IMAGE_GRAYSCALE);

    Mat Mask(1024, 1024, CV_8UC1, Scalar(1));

    subtract(M1, M2, Dif,Mask,3);

    imwrite("../data/difference/c.bmp", Dif);


    return 0;
}

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    当然,在将其保存为 BMP 格式后,您会得到一个无符号矩阵。如OpenCV documentation中所述:

    使用此功能只能保存 8 位(或 16 位无符号 (CV_16U),对于 PNG、JPEG 2000 和 TIFF)单通道或 3 通道(具有“BGR”通道顺序)图像。

    但是,如果您在保存之前查看您的Dif 矩阵,您会发现它是一个 16 位有符号矩阵。

    至少,以下代码 sn-p 可以按预期工作:

    cv::Mat m1(100, 100, CV_8U, cv::Scalar(50));
    cv::Mat m2(100, 100, CV_8U, cv::Scalar(30));
    
    cv::Mat dif;
    
    cv::Mat mask(100, 100, CV_8U, cv::Scalar(255));
    
    cv::subtract(m2, m1, dif, mask, CV_16S);
    
    std::cout << dif << std::endl;
    

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2018-01-30
      • 2010-12-13
      • 1970-01-01
      • 2020-05-17
      • 2011-04-09
      • 2017-03-24
      • 1970-01-01
      • 2020-05-11
      相关资源
      最近更新 更多