Ошибка сегментации при попытке выровнять изображение

Я читал об 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» не содержит ничего

1

Решение

Вы никогда не инициализировали Mat eqImпоэтому, когда вы делаете cv::imshow("Image", eqIm);
imwrite("eqIm.png", eqIm);
в мате ничего нет https://docs.opencv.org/2.4/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.html

Кроме того, я должен отметить, что у вас есть 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 строк (количество столбцов, умноженное на количество каналов на пиксель).

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]