OpenCV Image减法签名输出

时间:2016-08-09 05:33:42

标签: c++ opencv

我想要减去两个灰度图像(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;
}

1 个答案:

答案 0 :(得分:0)

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

  

使用此功能可以保存仅8位(或PNG,JPEG 2000和TIFF的16位无符号(CV_16U))单通道或3通道(带'BGR'通道顺序)图像。

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

至少,以下代码段按预期工作:

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;