2017-02-25 25 views
0

我正在写一个IOS应用程序,它决定矩形中的颜色强度。我的测量是计算红色矩形区域落在黑色背景顶部的白纸时的亮度值。显示是在iphone 6垂直举行,强度测量是在xcode的调试窗口中看到。当我在黑色背景中放置白纸时,强度值约为30,表示强度计算的位置可能表示黑色区域。当我将手机靠近白纸时,白纸位于手机底部附近,图片被放大,它的值接近200,这很有意义。你能告诉我我做错了什么吗?下面的代码是写在视图 - 控制时,Xcode 8.2.1IOS Opencv颜色值和位置不匹配

- (void)processImage:(cv::Mat&)image 
    cv::Mat curFrame = image 
    cv::rectangle(curFrame, cvPoint(180+15, 300-15),cv::Scalar(0,0,255, 255),5); 
    uchar intensity = curFrame.at<uchar>(cvPoint(180, 300)); 
    int intensityvalue = 255; 
    intensityvalue = (int) intensity; 
    NSLog (@"intensity: %d ", intensityvalue); 
+0

对不起手机水平不是垂直举行 – jay

+0

也是在这个例子中,180是垂直高度y,300是水平高度x。我知道opencv颠倒强度(y,x)。 – jay

+0

为什么在curFrame.at (cvPoint(180,300))''中使用'uchar'?由于你的curFrame的类型是BGRA,你应该用相应的类型来替换'uchar'。有关详细信息,请参见[this](http://stackoverflow.com/questions/7899108/opencv-get-pixel-channel-value-from-mat-image)。或者你可以分割'curFrame'的通道并在蓝色通道上使用'uchar'。 –

回答

0

如果你只需要强度,你可以尝试:

- (void)processImage:(cv::Mat&)image{ 
    cv::Mat curFrame = image // why don't you use image directly? 
    cv::Mat gray; 

    // convert to gray scale, make sure that your curFrame is RGBA or BGRA 
    cv::cvtColor(curFrame,gray,cv::CV_RGBA2GRAY); 
    int intensity = gray.at<uchar>(cvPoint(180, 300)); 
    NSLog (@"intensity: %d ", intensity); 

    // draw the rectangle after you already extract the intensity 
    // otherwise it may interfere with your sample 
    cv::rectangle(curFrame, cvPoint(180+15, 300-15),cv::Scalar(0,0,255, 255),5); 
} 
+0

更远,谢谢它现在的作品 – jay