Я читал об 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» не содержит ничего
Вы никогда не инициализировали Mat eqIm
поэтому, когда вы делаете cv::imshow("Image", eqIm);
в мате ничего нет https://docs.opencv.org/2.4/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.html
imwrite("eqIm.png", eqIm);
Кроме того, я должен отметить, что у вас есть 2 переменные eqIm
, Это может быть частью путаницы.
И последнее, что в вашем mean
функция, вы можете получить рекурсивную функцию. Вы должны указать, какую среднюю функцию вы используете в средней функции, которую вы создаете, т.е.
float mean(cv::Mat &image) {
cv:Scalar tempVal = cv::mean(image);
float myMAtMean = tempVal.val[0];
cout << "The value is " << myMAtMean;
return myMAtMean;
}
Ниже приводится кое-что ближе к тому, что вы ищете в своей функции выравнивания.
void equalization(cv::Mat &image, cv::Mat &green, int m) {
Mat eqIm(image.rows,image.cols,image.type());
int nl = image.rows; // number of lines
int nc = image.cols * image.channels();
for (int j = 0; j<nl; j++) {// j is each row
for (int ec = 0; ec < nc; ec++) {//ec is each col and channels
eqIm.data[j*image.cols*image.channels() + ec] = image.data[j*image.cols*image.channels() + ec] + m - green.data[j*image.cols*image.channels() + ec];
}
}
cv::imshow("Image", eqIm);
imwrite("eqIm.png", eqIm);
}
я делаю j*image.cols*image.channels()
пошагово пройти весь размер j строк (количество столбцов, умноженное на количество каналов на пиксель).
Других решений пока нет …