Ошибка сегментации при вызове функции, которая содержит изображение как параметр opencv/С++

-4

Я реализую метод, который декомпрессирует изображения, и я имею ошибку ошибки сегментации, я собираюсь начать с отображения вывода отладчика:

#0  0x0804c2cb in cv::Mat::Mat (this=0xbffff110, m=...)
at /usr/local/include/opencv2/core/mat.hpp:117
#1 0x0804ad14 in decompose (input=...) at main.cpp:241
#2 0x0804bbd7 in main (argc=2, argv=0xbffff6c4) at main.cpp:322

Вот часть моего кода:

#define MAX_ITERATIONS 15
//////////////////
/////////////////
float sum(cv::Mat img, int startedY, int startedX, int w) {
float res = 0.0f;
for (int j = startedY - ((w - 1) / 2) ; j < startedY + ((w + 1) / 2); j++)
for (int i = startedX - ((w - 1) / 2); i < startedX + ((w + 1) / 2); i++) {
{
if ((i >= 0 && i < img.size().width) && (j >= 0 && j < img.size().height)) { res += img.at<float>(j,i);
}}} return res; }

cv::Mat decompose(cv::Mat input)
{
/////////////
cv::Mat inputImg(input)
///////////////////
cv::Mat imgSource(inputImg);
cv::Mat imgMax(inputImg);
cv::Mat newImgMax(imgMax.size().height,imgMax.size().width,CV_32F);
////////////////////////////////
////////////////////////////////////
for (int l = 0; l < imgSource.size().width; l++){
for (int k = 0; k < imgSource.size().height; k++){
if( (k >= 0 && k < imgSource.size().height) && (l >= 0 && l <
imgSource.size().width) ) {
newImgMax.at<float>(k,l) = (float)sum(imgMax,k, l, wmax) / (wmax * wmax);***LIGNE 241*********
}}}
////////////////////
/////////////////////

******************************************************************
cv::Mat imgMoyenne(inputImg);

for (int i = 0; i < inputImg.size().height; i++) {
for (int j = 0; j < inputImg.size().width; j++) {
imgMoyenne.at<float>(i, j) = (newImgMin.at<float>(i, j) +
newImgMax.at<float>(i, j)) /2;
}
}
Mat diff_im=inputImg - imgMoyenne;

return diff_im; //the end of the decomposition function
}

*************************************************************
int main(int argc, char **argv)
{
char modeTitle[30]= {0}, residueTitle[50];
double variance = 1000000;
if (argc != 2) {
std::cout << "Usage: ./emd <image>" << std::endl;
return 1;
}
cv::Mat inputImg;
cv::Mat imgMode;

inputImg=imread(argv[1]);
if(! inputImg.data )
{cout << "Could not open or find the image" << std::endl ;
return -1; }

namedWindow("Source Image",WINDOW_AUTOSIZE);
imshow("Source Image",inputImg);
cv::waitKey(1000);
for (int i = 1; i < MAX_ITERATIONS + 1; i++) {
sprintf(modeTitle, "BEMC-%d", i);
std::cout << "Decomposing " << modeTitle << std::endl;
imgMode = decompose(inputImg);**************LIGNE 322****************
//////////////
/////////////
}

здесь часть /usr/local/include/opencv2/core/mat.hpp:

inline Mat::Mat(const Mat& m)
: flags(m.flags), dims(m.dims), rows(m.rows), cols(m.cols), data(m.data),
refcount(m.refcount), datastart(m.datastart), dataend(m.dataend),
datalimit(m.datalimit), allocator(m.allocator), size(&rows)
{
if( refcount )
CV_XADD(refcount, 1);**************** LIGNE 117******************
if( m.dims <= 2 )
{
step[0] = m.step[0]; step[1] = m.step[1];
}
else
{
dims = 0;
copySize(m);
}
}

Любые идеи, как я мог бы исправить эту проблему?

спросил(а) 2016-04-07T01:47:00+03:00 4 года, 2 месяца назад
0
67

Я не нашел return инструкцию в методе cv::Mat decompose(cv::Mat input) (это должно было вызвать предупреждения и может быть основной причиной проблемы). Также похоже, что этот код нельзя компилировать, поскольку inputImg не должен быть доступен здесь:

 cv::Mat decompose(cv::Mat input)
{
///////////////////
cv::Mat imgSource(inputImg);
cv::Mat imgMax(inputImg);
...
}

ответил(а) 2016-04-07T02:00:00+03:00 4 года, 2 месяца назад
55

Вы предполагаете, что входное изображение для вашей функции имеет тип CV_32FC1, так как вы CV_32FC1 к нему значения как .at<float>.

Однако inputImg из imread будет иметь тип CV_8UC3.


Вам нужно преобразовать inputImage в формат CV_32FC1, прежде чем передавать его для decompose:

 // read the image...

// From 3 to 1 channels
cvtColor(inputImage, inputImage, COLOR_BGR2GRAY);

// From CV_8U to CV_32F
inputImage.convertTo(inputImage, CV_32F);

// now you can enter the for loop...

ответил(а) 2016-04-07T11:47:00+03:00 4 года, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема