2014-06-06 24 views
6

Yardım için şimdiden teşekkür ederiz.OpenCV Laplacian formülüyle OpenCV görüntü algılayıp bulanıklaşıyor iOS

Çok sayıda R & D var ve arayın, ancak bulanık görüntüyü algılamak için herhangi bir çözüm bulamıyorum veya bulamıyorum.

kullandığım https://github.com/BloodAxe/OpenCV-Tutorial ve bulanıklık tespiti için Laplace formül kullanılmıştır görüntüde bulanıklık tespitini elde edilemez, bu

- (void) checkForBurryImage: (UIImage *) görüntü {

cv::Mat matImage = [image toMat]; 
cv::Mat matImageGrey; 
cv::cvtColor(matImage, matImageGrey, CV_BGRA2GRAY); 

cv::Mat dst2 =[image toMat]; 
cv::Mat laplacianImage; 
dst2.convertTo(laplacianImage, CV_8UC1); 
cv::Laplacian(matImageGrey, laplacianImage, CV_8U); 
cv::Mat laplacianImage8bit; 
laplacianImage.convertTo(laplacianImage8bit, CV_8UC1); 
//------------------------------------------------------------- 
//------------------------------------------------------------- 
unsigned char *pixels = laplacianImage8bit.data; 
//------------------------------------------------------------- 
//------------------------------------------------------------- 
// unsigned char *pixels = laplacianImage8bit.data; 
int maxLap = -16777216; 

for (int i = 0; i < (laplacianImage8bit.elemSize()*laplacianImage8bit.total()); i++) { 
    if (pixels[i] > maxLap) 
     maxLap = pixels[i]; 
} 

int soglia = -6118750; 

printf("\n maxLap : %i",maxLap); 


if (maxLap < soglia || maxLap == soglia) { 
    printf("\n\n***** blur image *****"); 
}else 
    printf("\nNOT a blur image"); } 

Ve ben Android ve onun iyi çalışıyor gibi aynı kodu kullandım ama IOS içinde, bana her zaman olumlu bir değer verin, bu yüzden çalışmadığını düşünüyorum,

Lütfen bana fikir veya bağlantı veya öneride bulunun.

+0

bu prob için uygun bir çözüm aldın mı? Aynı konuyla da karşı karşıyayım. – Prakash

cevap

3

için bu

-(BOOL) checkForBurryImage:(cv::Mat) matImage {// Output:(cv::Mat &) outputFrame { 

cv::Mat finalImage; 


cv::Mat matImageGrey; 
cv::cvtColor(matImage, matImageGrey, CV_BGRA2GRAY); 
matImage.release(); 

cv::Mat newEX; 
const int MEDIAN_BLUR_FILTER_SIZE = 15; // odd number 
cv::medianBlur(matImageGrey, newEX, MEDIAN_BLUR_FILTER_SIZE); 
matImageGrey.release(); 

cv::Mat laplacianImage; 
cv::Laplacian(newEX, laplacianImage, CV_8U); // CV_8U 
newEX.release(); 

cv::Mat laplacianImage8bit; 
laplacianImage.convertTo(laplacianImage8bit, CV_8UC1); 
laplacianImage.release(); 
cv::cvtColor(laplacianImage8bit,finalImage,CV_GRAY2BGRA); 
laplacianImage8bit.release(); 

int rows = finalImage.rows; 
int cols= finalImage.cols; 
char *pixels = reinterpret_cast<char *>(finalImage.data); 
int maxLap = -16777216; 
for (int i = 0; i < (rows*cols); i++) { 
    if (pixels[i] > maxLap) 
     maxLap = pixels[i]; 
} 

int soglia = -6118750;  

pixels=NULL; 
finalImage.release(); 

BOOL isBlur = (maxLap < kBlurThreshhold)? YES : NO; 
return isBlur; 

}

+0

Neden "int soglia = -6118750;" var yöntemde? –

+0

kBlurThreshold değeri nedir? –

0

Aşağıdaki yöntem OpenCV kullanır:

- (BOOL) isImageBlurry:(UIImage *) image { 
    // converting UIImage to OpenCV format - Mat 
    cv::Mat matImage = [self convertUIImageToCVMat:image]; 
    cv::Mat matImageGrey; 
    // converting image's color space (RGB) to grayscale 
    cv::cvtColor(matImage, matImageGrey, CV_BGR2GRAY); 

    cv::Mat dst2 = [self convertUIImageToCVMat:image]; 
    cv::Mat laplacianImage; 
    dst2.convertTo(laplacianImage, CV_8UC1); 

    // applying Laplacian operator to the image 
    cv::Laplacian(matImageGrey, laplacianImage, CV_8U); 
    cv::Mat laplacianImage8bit; 
    laplacianImage.convertTo(laplacianImage8bit, CV_8UC1); 

    unsigned char *pixels = laplacianImage8bit.data; 

    // 16777216 = 256*256*256 
    int maxLap = -16777216; 
    for (int i = 0; i < (laplacianImage8bit.elemSize()*laplacianImage8bit.total()); i++) { 
     if (pixels[i] > maxLap) { 
      maxLap = pixels[i]; 
     } 
    } 
    // one of the main parameters here: threshold sets the sensitivity for the blur check 
    // smaller number = less sensitive; default = 180 
    int threshold = 100;   

    return (maxLap <= threshold); 
} 

OpenCV::Mat

012- UIImage dönüştürme
- (cv::Mat)convertUIImageToCVMat:(UIImage *)image { 
    CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage); 
    CGFloat cols = image.size.width; 
    CGFloat rows = image.size.height; 

    cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha) 

    CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,     // Pointer to data 
                cols,      // Width of bitmap 
                rows,      // Height of bitmap 
                8,       // Bits per component 
                cvMat.step[0],    // Bytes per row 
                colorSpace,     // Colorspace 
                kCGImageAlphaNoneSkipLast | 
                kCGBitmapByteOrderDefault); // Bitmap info flags 

    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage); 
    CGContextRelease(contextRef); 

    return cvMat; 
} 
0

bunu kullanın:

Laplacian(gray, laplacianImage, CV_64F); 
    Scalar mean, stddev; //0:1st channel, 1:2nd channel and 2:3rd channel 
    meanStdDev(laplacianImage, mean, stddev, Mat()); 
    double variance = stddev.val[0] * stddev.val[0]; 

    double threshold = 2900; 

    if (variance <= threshold) { 
     BLURRR 
    } 
    else{ 
     NOT BLURR 
    }