请查看以下代码
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);
}
运行此代码时出现以下错误
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).
代码在此处*itout = 255;
中断,它位于ColorDetector.cpp的while
循环内。
我在这做错了什么?请帮忙!
答案 0 :(得分:5)
您收到此错误是因为result
小于image
,并且在某些时候您到达result.end()
之前达到了image.end()
。
result.create(result.rows,result.cols,CV_8U);
你的意思是?
result.create(image.rows,image.cols,CV_8U);
答案 1 :(得分:3)
问题是这段代码:
*++it;
*++itout;
应该只是:
++it;
++itout;
编辑 - 看到评论,看来这不是正确用法,但可能不会导致您的问题。
,