Я работаю с некоторым обнаружением объектов, используя OpenCV 2.4.4
с C ++. К сожалению, те объекты, которые я должен обнаружить, не имеют уникальной формы, но у них действительно есть определенный диапазон цветов в цветовом пространстве HSV (сейчас я обнаруживаю некоторые красные объекты).
Кроме того, объект должен присутствовать только в некоторой части изображения, поэтому я не сканирую все изображение, более того, под этой областью интереса у меня есть вспомогательные области интереса (маленькие прямоугольники, и мне нужно знать, в каком из этих прямоугольников объект находится в рамке).
Итак, сначала я попытался обнаружить, что что-то было найдено в большом ROI, и если это было так, я установил для него какой-то цвет, чуждый моему окружению. Я сделал это с помощью следующего кода:
cvtColor(frame(Range(0,espv),Range::all()),framhsv,CV_BGR2HSV);
MatIterator_<Vec3b> it, ith, end, endh;
ith = framhsv.begin<Vec3b>();
endh = framhsv.end<Vec3b>();
it = (frame(Range(0,espv),Range::all())).begin<Vec3b>();
for (;ith != endh; ++it,++ith){
if( (((*ith)[0] <=7 && (*ith)[0]>=0)||((*ith)[0]>170)) && (*ith)[1]>=160){
(*it)[0] = 63;
(*it)[1] = 0;
(*it)[2] = 255;}}
Все работало правильно, и объект был «обнаружен», поэтому я перешел к следующему крутому кругу, который обнаруживает, находился ли объект в каждой под-области интереса. Для этого я создал следующую функцию, которая возвращает количество «обнаруженных» пикселей в каждой вспомогательной области интереса, поэтому я могу рассмотреть, какая из них является правильной вспомогательной областью интереса.
Вот функция:
Vector<int> CountRed(cv::Mat &frame, int hspa, int vspa, int nlines ,int nblocks){
Vector<int> count(nblocks*nlines,0);
for(int i = 1; i<= nlines; i++){
for(int j = 1; j<= nblocks; j++){
Mat framhsv;
cvtColor(frame(Range((i-1)*vspa,i*vspa),Range((j-1)*hspa,j*hspa)),framhsv,CV_BGR2HSV); //Converte somente a área de interesse para HSV
MatIterator_<Vec3b> it, ith, endh;
ith = framhsv.begin<Vec3b>();
endh = framhsv.end<Vec3b>();
it = (frame(Range((i-1)*vspa,i*vspa),Range((j-1)*hspa,j*hspa))).begin<Vec3b>();
for (;ith != endh; ++it,++ith){
if( (((*ith)[0] <=7 && (*ith)[0]>=0)||((*ith)[0]>170)) && (*ith)[1]>=160){
(*it)[0] = 63;
(*it)[1] = 0;
(*it)[2] = 255;
count[(j)+nblocks*(i-1)-1]++;}}}}
return count;
}
Код компилируется без предупреждений или ошибок, и появляется видео, но если я вставляю объект, который должен обнаружить в любой части ROI, код перестает работать, это также происходит, если я удаляю:
count[(j)+nblocks*(i-1)-1]++;
линия. Я получаю следующую ошибку:
Access violation writing location 0xFFFFF970.
Я действительно думаю, что проблема заключается в доступе к итератору, когда он не используется Range::All()
Чтобы попытаться уточнить, что я здесь делаю, это изображение рамки:
http://i.imgur.com/Irvr8bk.jpg
фиолетовая область — это рамка, красная область — область интереса, а каждая из черных — вспомогательная область интереса.
Я также пытался использовать frame(Rect(0,0,frame.cols,2*vspa)
определить рентабельность инвестиций, и это также сработало, но я получил ту же ошибку при попытке работать с суб-ROI, используя cv::Rect
, Итак, я действительно думаю, что это должно быть MatIterator_
ошибка при отсутствии доступа к полной структуре строки.
Итак, что я должен сделать, чтобы работать с этими суб-ROI?
Задача ещё не решена.
Других решений пока нет …