Access violation writing location 0x00000000

1

Here is my code:

ColorDetector.h

#pragma 
#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;

class ColorDetector
{
public:
    ColorDetector(void);
    ~ColorDetector(void);

    //Set the Color Distance
    void SetColorDistanceThreshold(int);

    //Get the Color distance
    int GetColorDistanceThreshold();

    //Detect Colours of the image
    Mat Process(Mat &image);

    //Set the Target color using 3 channels
    void SetTargetColor(unsigned char red, unsigned char green, unsigned char blue);

    //Set the Target color using Vec3b
    //This will hold the whole color value at once
    void SetTargetColor(Vec3b color);

    //Returns the target color
    Vec3b GetTargetColor();

    //Gets the distancefrom the target color
    int GetDistance(const Vec3b &)const;

private:
    int minDist; //Minimum acceptable distance
    Mat result; //The resulting image
    Vec3b target; //The target colour
};

ColorDetector.cpp

#include "ColorDetector.h"


ColorDetector::ColorDetector(void)
{
    //Set the RGB Values
    target[0] = 0;
    target[1] = 0;
    target[2] = 0;
}


ColorDetector::~ColorDetector(void)
{
}

void ColorDetector::SetColorDistanceThreshold(int distance)
{
    if(distance>0)
    {
        minDist = distance;
    }
    else
    {
        minDist = 0;
    }
}

int ColorDetector::GetColorDistanceThreshold()
{
    return minDist;
}

void ColorDetector::SetTargetColor(unsigned char red, unsigned char green, unsigned char blue)
{
    //BGR Order
    target[0] = blue;
    target[1] = green;
    target[2] = red;
}

void ColorDetector::SetTargetColor(Vec3b color)
{
    target = color;
}

Vec3b ColorDetector::GetTargetColor()
{
    return target;
}

int ColorDetector::GetDistance(const Vec3b &color)const
{
    int distance = abs(color[0]-target[0]) +
                   abs(color[1]-target[1]) +
                   abs(color[2]-target[2]);

    return distance;

}

Mat ColorDetector::Process(Mat &image)
{
    result.create(result.rows,result.cols,CV_8U);

    //Loop
    Mat_<Vec3b>::const_iterator it = image.begin<Vec3b>();
    Mat_<Vec3b>::const_iterator itend = image.end<Vec3b>();

    Mat_<uchar>::iterator itout = result.begin<uchar>();

    while( it != itend)
    {
        

        //Compute distance from target color
        if(GetDistance(*it)<minDist)
        {
            *itout = 255;
        }
        else
        {
            *itout = 0;
        }

        *++it;
        *++itout;
    }

    return result;
}

ColorDetectorMain.cpp

#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include "ColorDetector.h"

using namespace std;

    int main()
    {
        ColorDetector cd;
    
        Mat image = imread("C:/Users/Public/Pictures/Sample Pictures/Tulips.jpg");
    
        try
        {
            if(!image.data)
            {
                throw 1;
            }
        }
        catch(int i)
        {
            cout << "Unable to read the image" << endl;
        }
    
        cd.SetColorDistanceThreshold(100);
        cd.SetTargetColor(130,190,230);
    
        namedWindow("Result");
        imshow("Result",cd.Process(image));
    
        waitKey(0);
    }

I get the following error when I run this code

First-chance exception at 0x013a16a5 in OpenCv.exe: 0xC0000005: Access violation writing location 0x00000000.
Unhandled exception at 0x013a16a5 in OpenCv.exe: 0xC0000005: Access violation writing location 0x00000000.
The program '[4768] OpenCv.exe: Native' has exited with code -1073741819 (0xc0000005).

The code breaks here *itout = 255; which in inside the while loop of ColorDetector.cpp.

What am I doing here wrong?

c++
visual-studio-2010
image
opencv
image-processing
asked on Stack Overflow Apr 22, 2013 by PeakGen • edited Apr 2, 2021 by halfer

2 Answers

5

You get this error because result is smaller than image and at some point you reach result.end() before reaching image.end().

    result.create(result.rows,result.cols,CV_8U);

Did you mean this?

    result.create(image.rows,image.cols,CV_8U);
answered on Stack Overflow Apr 22, 2013 by syam
3

the problem is this code:

    *++it;
    *++itout;

which should just be:

    ++it;
    ++itout;

EDIT - see comments, it appears that this is not correct usage, but probably didn't cause your problem. I'll leave the answer unless it gets downvotes because it may be helpful.

answered on Stack Overflow Apr 22, 2013 by Roger Rowland

User contributions licensed under CC BY-SA 3.0