Я хочу найти hwo, чтобы получить разные черно-белые изображения diff для реализации в системе в целях безопасности. Я хочу проверить, возникла ли какая-либо разница между ними. Для отслеживания объектов я реализовал обнаружение canny в программе ниже. Я легко получаю контуры структурированных объектов … которые затем можно вычесть, чтобы получить только контур разницы в дельта-изображении … но что, если на втором изображении есть неструктурные различия, такие как дым или огонь? я увеличил контраст для более четкого обнаружения краев, а также изменил пороговые значения в параметрах canny fn .. все же не получил подходящих результатов.
также хитрый край также обнаруживает тени. если мои два одинаковых изображения были сделаны в разное время в течение дня, тени будут различаться, поэтому края будут меняться и будут вызывать нежелательную ложную тревогу
как мне обойти это? Кто-нибудь может помочь? Спасибо!
Использование языка c API в enter code here
OpenCV 2.4 в Visual Studio 2010
#include "stdafx.h"#include "cv.h"#include "highgui.h"#include "cxcore.h"#include <math.h>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main()
{
IplImage* img1 = NULL;
if ((img1 = cvLoadImage("libertyH1.jpg"))== 0)
{
printf("cvLoadImage failed\n");
}
IplImage* gray1 = cvCreateImage(cvGetSize(img1), IPL_DEPTH_8U, 1); //contains greyscale //image
CvMemStorage* storage1 = cvCreateMemStorage(0); //struct for storage
cvCvtColor(img1, gray1, CV_BGR2GRAY); //convert to greyscale
cvSmooth(gray1, gray1, CV_GAUSSIAN, 7, 7); // This is done so as to //prevent a lot of false circles from being detected
IplImage* canny1 = cvCreateImage(cvGetSize(gray1),IPL_DEPTH_8U,1);
IplImage* rgbcanny1 = cvCreateImage(cvGetSize(gray1),IPL_DEPTH_8U,3);
cvCanny(gray1, canny1, 50, 100, 3); //cvCanny( const //CvArr* image, CvArr* edges(output edge map), double threshold1, double threshold2, int //aperture_size CV_DEFAULT(3) );
cvNamedWindow("Canny before hough");
cvShowImage("Canny before hough", canny1);
CvSeq* circles1 = cvHoughCircles(gray1, storage1, CV_HOUGH_GRADIENT, 1, gray1->height/3, 250, 100);
cvCvtColor(canny1, rgbcanny1, CV_GRAY2BGR);
cvNamedWindow("Canny after hough");
cvShowImage("Canny after hough", rgbcanny1);
for (size_t i = 0; i < circles1->total; i++)
{
// round the floats to an int
float* p = (float*)cvGetSeqElem(circles1, i);
cv::Point center(cvRound(p[0]), cvRound(p[1]));
int radius = cvRound(p[2]);
// draw the circle center
cvCircle(rgbcanny1, center, 3, CV_RGB(0,255,0), -1, 8, 0 );
// draw the circle outline
cvCircle(rgbcanny1, center, radius+1, CV_RGB(0,0,255), 2, 8, 0 );
printf("x: %d y: %d r: %d\n",center.x,center.y, radius);
}//////////////////////////////////////////////////////////////////////////////////////////////////////////////
IplImage* img2 = NULL;
if ((img2 = cvLoadImage("liberty_wth_obj.jpg"))== 0)
{
printf("cvLoadImage failed\n");
}
IplImage* gray2 = cvCreateImage(cvGetSize(img2), IPL_DEPTH_8U, 1);
CvMemStorage* storage = cvCreateMemStorage(0);
cvCvtColor(img2, gray2, CV_BGR2GRAY);
// This is done so as to prevent a lot of false circles from being detected
cvSmooth(gray2, gray2, CV_GAUSSIAN, 7, 7);
IplImage* canny2 = cvCreateImage(cvGetSize(img2),IPL_DEPTH_8U,1);
IplImage* rgbcanny2 = cvCreateImage(cvGetSize(img2),IPL_DEPTH_8U,3);
cvCanny(gray2, canny2, 50, 100, 3);
CvSeq* circles2 = cvHoughCircles(gray2, storage, CV_HOUGH_GRADIENT, 1, gray2->height/3, 250, 100);
cvCvtColor(canny2, rgbcanny2, CV_GRAY2BGR);
for (size_t i = 0; i < circles2->total; i++)
{
// round the floats to an int
float* p = (float*)cvGetSeqElem(circles2, i);
cv::Point center(cvRound(p[0]), cvRound(p[1]));
int radius = cvRound(p[2]);
// draw the circle center
cvCircle(rgbcanny2, center, 3, CV_RGB(0,255,0), -1, 8, 0 );
// draw the circle outline
cvCircle(rgbcanny2, center, radius+1, CV_RGB(0,0,255), 2, 8, 0 );
printf("x: %d y: %d r: %d\n",center.x,center.y, radius);
}
Вы хотите помощь кода здесь? Это не простая задача. Есть несколько алгоритмов, доступных в Интернете, или вы можете попробовать изобрести новый. Много исследований идет об этом. У меня есть представление о процессе. Вы можете найти края по Y
от YCbCr
цветовая система. Вычесть это Y
значение от размытого изображения Y
значение. Тогда вы получите преимущество. Теперь создайте представление массива. Вы должны разделить изображение на блоки. Теперь проверьте блок с блоками. Он может скользить, вращаться, скручиваться и т. Д. Сравните с сопоставлением массивов. Отслеживание объектов затруднено из-за фона. Будьте осторожны, не используйте ненужные предметы.
Я думаю, что путь может быть вычитание фона. Это позволяет вам справиться с изменениями условий освещения.
Увидеть запись в википедии для вступления. Основная идея заключается в том, что вы должны построить модель для фона сцены, тогда все различия вычисляются относительно фона.
Я провел некоторый анализ различий в изображениях, но код был написан для Java. Пожалуйста, посмотрите на ссылку ниже, которая может прийти на помощь
Как найти прямоугольник разницы между двумя изображениями
Ура!