我正在尝试学习OpenCV,我想应用这个简单的公式:
这是一个按像素操作,并将像素从 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
我尝试使用灰色和彩色图像,cvtColor
使用CV_8U
,CV_32F
和C1
,C3
,但我总是 0作为深度 ..
我花了几个小时在OpenCV手册和 OpenCV-2.3.1 / modules / core / include / opencv2 / core / types_c.h 但是......我找不到解决方案。我想我对Mat
对象的变换深度有一些混淆。
答案 0 :(得分:6)
您确定已将图片转换为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);
}
以下是我得到的输出:
答案 1 :(得分:0)
交换以下行以获得更好的结果:
cv::normalize(fg,fg,0,255,cv::NORM_MINMAX);
cv::convertScaleAbs(fg,fg);