【发布时间】:2017-11-19 21:32:15
【问题描述】:
我一直在阅读有关opencv的信息并且一直在做一些练习,在这种情况下我想执行图像均衡,我已经实现了以下代码,但是当我执行它时,我得到了以下错误:
“分段错误(核心转储)”
所以我不知道什么时候到期。
我尝试使用的公式如下:
代码如下:
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <stdio.h>
using namespace cv;
using namespace std;
void equalization(cv::Mat &image,cv::Mat &green, int m) {
Mat eqIm;
int nl= image.rows; // number of lines
int nc= image.cols * image.channels();
for (int j=0; j<nl; j++) {
uchar* data= image.ptr<uchar>(j);
uchar* data2= green.ptr<uchar>(j);
uchar* eqIm= green.ptr<uchar>(j);
for (int i=0; i<nc; i++) {
eqIm[i]= data[i]+m-data2[i];
}
}
cv::imshow("Image",eqIm);
imwrite("eqIm.png",eqIm);
}
float mean(cv::Mat &image){
cv:Scalar tempVal = mean( image );
float myMAtMean = tempVal.val[0];
cout << "The value is " << myMAtMean;
}
int main(int argc, char** argv ){
Mat dst;
Mat image= cv::imread("img.jpg");
Mat green= cv::imread("green.jpg");
cv::imshow("Image",image);
float m= mean(image);
equalization(image,green,m);
cv::namedWindow("Image");
cv::imshow("Image",image);
imwrite("equalizated.png",dst);
waitKey(0);
return 0;
}
并且写入的图像“Equalization.png”什么都不包含
【问题讨论】:
-
除了胡椒杰克的回答:Avoid
using namespace|不要包含你不需要的东西(为什么stdio.h?)|编译时,启用警告并将其视为错误。 |人们会期望一个名为mean的函数计算并返回平均值,而不是将其打印到控制台并通过省略 return 语句导致 UB。 |同样,人们会期望equalization实际返回均衡后的图像,而不是将其保存到硬编码文件、弹出窗口、丢弃结果并期待...... -
... 用户(如在程序员中使用该函数)记得在之后调用
waitKey以使可视化工作。 (POLA) |最后,熟悉 OpenCV 文档,尤其是基本类型,例如cv::Mat以及它们上可用的操作。然后使用那些高级抽象。比如equalization的body基本就是Mat eqIm = image + m - green;。
标签: c++ image opencv equalizer