OpenCV:改变深度和对数变换

标签 opencv depth

我正在尝试学习 OpenCV,我想应用这个简单的公式: enter image description here

这是一个逐像素操作,将像素从 r 转换为 s

这是我的代码:

int main(int /*argc*/, char** /*argv*/) {

    Mat _img = imread("lena.jpg"); 
    cvtColor(_img, img, CV_32F);

    cout << "original image size: " << img.rows << " " << img.cols << endl;
    cout << "original type: " << img.type() << endl;
    cout << "original depth: " << img.depth() << endl;

    Mat _src = img.clone();
    _src += 1;
    log(_src, logContrast);
    logContrast *= log_c;

    /// ...

我得到这个错误:

OpenCV Error: Assertion failed (depth == CV_32F || depth == CV_64F) in log, file /home/user/Documents/Code/OpenCV-2.3.1/modules/core/src/mathfuncs.cpp, line 1772
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/alberto/Documents/Code/OpenCV-2.3.1/modules/core/src/mathfuncs.cpp:1772: error: (-215) depth == CV_32F || depth == CV_64F in function log

我尝试使用灰色和彩色图像,以及使用 cvtColorCV_8UCV_32FC1C3,但我总是将 0 作为深度..

我在 OpenCV 手册和 OpenCV-2.3.1/modules/core/include/opencv2/core/types_c.h 上花费了数小时,但是..我找不到解决方案。我想我对如何转换 Mat 对象的深度有些困惑。

最佳答案

您确定将图像转换为 float32 吗?

请查看下面的代码,我刚刚写的。不知道输出是否正确,但没有抛出任何错误。

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

int main ()
{
    cv::Mat binary = cv::imread("kick.jpg",0);

    cv::Mat fg;
    binary.convertTo(fg,CV_32F);
    fg = fg + 1;
    cv::log(fg,fg);
    cv::convertScaleAbs(fg,fg);
    cv::normalize(fg,fg,0,255,cv::NORM_MINMAX);
    cv::imshow("a",fg);
cv::waitKey(0);
}

下面是我得到的输出:

enter image description here

关于OpenCV:改变深度和对数变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11507224/

相关文章:

c++ - OpenCV 中的 Matlab fft2 函数

c++ - 从 (x,y) 像素坐标获取 3D 世界坐标

function - Postgresql:插入/更新后触发函数:堆栈深度限制错误

list - 使用(受限)Racket 查找列表的深度

r - 使用 ggplot 绘制深度剖面

c++ - OpenCVs LineIterator 在 MATLAB 中的等价物

java - 如何修复 java 示例的导入

opencv-使用光流的车辆跟踪

c++ - opencv中最好的立体对应算法

perl - 当使用 Perl 的 File::Find 时,限制搜索深度的快速简便方法是什么?