2013-03-22 2 views
0

전 이미지 처리가 처음이에요. 내 질문은 ...중복 이미지가 목록에 있는지 확인할 수 있습니까?

카메라를 사용하여 이미지를 찍은 다음 이미지를 사용하여 목록 컨테이너에 대해 확인합니다. 목록 컨테이너에이 이미지와 비슷한 이미지가 있으면 작업을 수행하고 그렇지 않으면 수행하지 않습니다.

예 ...

  1. 나는 하나 개의 이미지 "img_one"가
  2. 내 목록
  3. 표시 목록이 image_one있다 "image_one, image_two, image_three"를 포함 (즉, 그것은 이미지처럼 보인다)

그럼이 이미지를 목록 컨테이너의 항목과 비교하여 어떤 이미지가이 이미지처럼 보이는지 어떻게 표시합니까?

미리 감사드립니다. 모든 아이디어는 높이 평가됩니다.

+0

이미지 처리 중 @djaqeel 내가 – QuokMoon

+0

[OpenCV와 유사성 검사를위한 이미지]를 작성했습니다. (http://stackoverflow.com/questions/11541154/checking-images-for-similarity-with-opencv) – Sam

답변

1

opencv에는 그러한 기능이 존재하지 않는다고 생각합니다. 픽셀을 반복해서 살펴보고 하나씩 확인해야합니다. 샘플 코드는 다음과 같이 할 수 있습니다 : 당신이 조금 더 빨리 모든 픽셀을 통해 반복 할 경우 OpenCV: Matrix Iteration 볼 수

bool identical(cv::Mat m1, cv::Mat m2) 
{ 
    if (m1.cols != m2.cols || m1.rows != m2.rows || m1.channels() != m2.channels() || m1.type() != m2.type()) 
    { 
     return false; 
    } 

    for (int i = 0; i < m1.rows; i++) 
    { 
     for (int j = 0; j < m1.cols; j++) 
     { 
      if (m1.at(i, j) != m2.at(i, j)) 
      { 
       return false; 
      } 
     } 
    } 
    return true; 
} 

.

+0

Pretty 많은 스포트! –

-1

두 이미지를 비교하는 데 약간의 시간이 걸리는 프로세스라고 생각합니다. 그러나 당신은 그 이미지의 바이너리를 어댑터 나 ListView를 사용하여 이미지를 바인딩하는 곳과 비교함으로써 확인할 수 있습니다.

2

"복제"로 무엇을 정의 하느냐에 따라 크게 달라집니다.

절대적으로 동일한 사본 (복사하여 붙여 넣기)을 찾는 경우 게임이 간단합니다. Safir에서 제안한 접근 방식은 성능 향상과 함께 몇 가지 장점 만 있습니다.

거의 정확한 중복을 찾으려면 작업이 갑자기 매우 어려워집니다. 자세한 내용은 Checking images for similarity with OpenCV을 확인하십시오.

이제 "간단한"방법으로 비교하면 얼마나 많은 사진을 비교해야하는지에 따라 다릅니다. 1000 이미지가있는 폴더의 모든 다른 이미지와 비교하여 각 이미지를 비교하면 1.000.000 이미지 읽기 및 비교가 가능합니다. (RAM에 한 번에 모두 저장할 수 없으므로 수백만 번로드하고 언로드해야합니다.) 그런 식으로 강력한 데스크톱 프로세서조차도 너무 많습니다.

간단한 방법은 각 이미지에 해싱 함수 (sha2)를 사용하고 해시 만 비교하는 것입니다. 좋은 ad-hoc 이미지의 "해싱"은 히스토그램 일 수 있습니다 (긍정적 인 경우 memcmp로 다시 확인하고 싶을 수도 있음).

brute-force 접근법 (각 이미지 픽셀을 다른 픽셀과 비교)을 시도하더라도 더 빠른 방법은 이미지를 픽셀 단위로 액세스하는 대신 memcmp()를 사용하는 것입니다.

관련 문제