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?
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);
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.
User contributions licensed under CC BY-SA 3.0