簡體   English   中英

OpenCV。 圖像返回為灰度而不是RGB

[英]OpenCV. Image returned as a grayscale instead of RGB

我正在使用iOS上的OpenCV做一些實驗。 我嘗試將png圖像放置在檢測到的面部上,這就是我嘗試放置在檢測到的面部上的圖像: 在此處輸入圖片說明

但是我明白了。 在此處輸入圖片說明

我使用此函數將UIImage轉換為cvMat。

- (cv::Mat)cvMatFromUIImage:(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

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);
CGColorSpaceRelease(colorSpace);

return cvMat;
}

我在這里添加圖像:

- (void)processImage:(cv::Mat&)image;
{
 cv::vector<cv::Rect> faces;
 cv::Mat frame_gray;

cvtColor(image, frame_gray, CV_BGRA2GRAY);
equalizeHist(frame_gray, frame_gray);

face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE,   cv::Size(100, 100));

for(unsigned int i = 0; i < faces.size(); ++i)
{
    rectangle(image, cv::Point(faces[i].x, faces[i].y),
              cv::Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height),
              cv::Scalar(0,255,255));
    CGPoint pos;
    pos.x = faces[i].x;
    pos.y = faces[i].y;

    cv::Rect roi( cv::Point( pos.x , pos.y ), cv::Size( faces[i].width , faces[i].height   ));
    cv::Mat destinationROI = image( roi );
    cv::Mat smallImage = [self faceIntoImageView:pos size:CGSizeMake(faces[i].width,   faces[i].height)];
    smallImage.copyTo(image(roi));

 }
 }

-(cv::Mat)faceIntoImageView:(CGPoint)position size:(CGSize)size
{

UIImage* face = [UIImage imageNamed:@"Face1.png"];
face = [self imageWithImage:face scaledToSize:size];
return [self cvMatFromUIImage:face];
}

您應該交換B和R通道。

    - (cv::Mat)cvMatFromUIImage:(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

    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);
    CGColorSpaceRelease(colorSpace);

//-------swap channels
std::vector<Mat> ch;
cv::split(cvMat,ch);
std::swap(ch[0],ch[2]);
cv::merge(ch,cvMat);
//-------
    return cvMat;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM