Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何编译vImage浮雕效果示例代码?_Ios_Objective C_Accelerate Framework_Vimage - Fatal编程技术网

Ios 如何编译vImage浮雕效果示例代码?

Ios 如何编译vImage浮雕效果示例代码?,ios,objective-c,accelerate-framework,vimage,Ios,Objective C,Accelerate Framework,Vimage,以下是在中找到的代码: 问题在于:内核变量似乎引用了三种不同的类型: 形式参数列表中的void*内核 一个未定义的无符号int uint_8内核,作为一个新变量,可能会隐藏形式参数 调用vImageConvolve_argb888时使用常量签名的int*内核 这是实际代码吗?如何编译此函数 这就是我使用Avassetrader处理从视频读取的帧的方法。这是模糊的,但您可以更改内核以满足您的需要imageData’当然可以通过其他方式获得,例如从UIImage获得 CMSampleBuf

以下是在中找到的代码:

问题在于:内核变量似乎引用了三种不同的类型:

  • 形式参数列表中的void*内核
  • 一个未定义的无符号int uint_8内核,作为一个新变量,可能会隐藏形式参数
  • 调用vImageConvolve_argb888时使用常量签名的int*内核

  • 这是实际代码吗?如何编译此函数

    这就是我使用Avassetrader处理从视频读取的帧的方法。这是模糊的,但您可以更改内核以满足您的需要imageData’当然可以通过其他方式获得,例如从UIImage获得

         CMSampleBufferRef sampleBuffer = [asset_reader_output copyNextSampleBuffer];
         CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);            
         CVPixelBufferLockBaseAddress(imageBuffer,0);
         void *imageData = CVPixelBufferGetBaseAddress(imageBuffer);        
    
         int16_t kernel[9];
         for(int i = 0; i < 9; i++) {
            kernel[i] = 1;
         }
         kernel[4] = 2;
    
         unsigned char *newData= (unsigned char*)malloc(4*currSize);
    
         vImage_Buffer  inBuff = { imageData, height, width, 4*width };
         vImage_Buffer  outBuff = { newData, height, width, 4*width };
    
         vImage_Error err=vImageConvolve_ARGB8888 (&inBuff,&outBuff,NULL, 0,0,kernel,3,3,10,nil,kvImageEdgeExtend);
         if (err != kvImageNoError) NSLog(@"convolve error %ld", err);
         CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
    
         //newData holds the processed image
    
    CMSampleBufferRef sampleBuffer=[asset\u reader\u output copyNextSampleBuffer];
    CVImageBufferRef imageBuffer=CMSampleBufferGetImageBuffer(sampleBuffer);
    CVPixelBufferLockBaseAddress(imageBuffer,0);
    void*imageData=CVPixelBufferGetBaseAddress(imageBuffer);
    int16_t内核[9];
    对于(int i=0;i<9;i++){
    核[i]=1;
    }
    核[4]=2;
    unsigned char*newData=(unsigned char*)malloc(4*currSize);
    vImage_Buffer inBuff={imageData,高度,宽度,4*width};
    vImage_缓冲区溢出={newData,高度,宽度,4*width};
    vImage_Error err=vImageConvolve_argb888(&inBuff,&exputff,NULL,0,0,内核,3,3,10,nil,kvmageedgeextend);
    如果(err!=kvImageNoError)NSLog(@“卷积错误%ld”,err);
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);
    //newData保存处理后的图像
    
    这是我使用Avassetrader处理从视频读取的帧的方法。这是模糊的,但您可以更改内核以满足您的需要imageData’当然可以通过其他方式获得,例如从UIImage获得

         CMSampleBufferRef sampleBuffer = [asset_reader_output copyNextSampleBuffer];
         CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);            
         CVPixelBufferLockBaseAddress(imageBuffer,0);
         void *imageData = CVPixelBufferGetBaseAddress(imageBuffer);        
    
         int16_t kernel[9];
         for(int i = 0; i < 9; i++) {
            kernel[i] = 1;
         }
         kernel[4] = 2;
    
         unsigned char *newData= (unsigned char*)malloc(4*currSize);
    
         vImage_Buffer  inBuff = { imageData, height, width, 4*width };
         vImage_Buffer  outBuff = { newData, height, width, 4*width };
    
         vImage_Error err=vImageConvolve_ARGB8888 (&inBuff,&outBuff,NULL, 0,0,kernel,3,3,10,nil,kvImageEdgeExtend);
         if (err != kvImageNoError) NSLog(@"convolve error %ld", err);
         CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
    
         //newData holds the processed image
    
    CMSampleBufferRef sampleBuffer=[asset\u reader\u output copyNextSampleBuffer];
    CVImageBufferRef imageBuffer=CMSampleBufferGetImageBuffer(sampleBuffer);
    CVPixelBufferLockBaseAddress(imageBuffer,0);
    void*imageData=CVPixelBufferGetBaseAddress(imageBuffer);
    int16_t内核[9];
    对于(int i=0;i<9;i++){
    核[i]=1;
    }
    核[4]=2;
    unsigned char*newData=(unsigned char*)malloc(4*currSize);
    vImage_Buffer inBuff={imageData,高度,宽度,4*width};
    vImage_缓冲区溢出={newData,高度,宽度,4*width};
    vImage_Error err=vImageConvolve_argb888(&inBuff,&exputff,NULL,0,0,内核,3,3,10,nil,kvmageedgeextend);
    如果(err!=kvImageNoError)NSLog(@“卷积错误%ld”,err);
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);
    //newData保存处理后的图像
    
    内核就是卷积中使用的内核。在数学术语中,矩阵与图像卷积,以实现模糊/锐化/浮雕或其他效果。您提供的这个函数只是vimage卷积函数的一个薄包装。要实际执行卷积运算,可以按照下面的代码进行。代码都是手工输入的,所以不一定100%正确,但应该指向正确的方向

    要使用此功能,首先需要对图像进行像素访问。假设您有一个UIImage,您可以执行以下操作:

    //image is a UIImage
    CGImageRef img = image.CGImage;
    CGDataProviderRef dataProvider = CGImageGetDataProvider(img); 
    CFDataRef cfData = CGDataProviderCopyData(dataProvider);
    void * dataPtr = (void*)CFDataGetBytePtr(cfData);
    
    接下来,构建将传递给函数的vImage_缓冲区

    vImage_Buffer inBuffer, outBuffer;
    inBuffer.data = dataPtr;
    inBuffer.width = CGImageGetWidth(img);
    inBuffer.height = CGImageGetHeight(img);
    inBuffer.rowBytes = CGImageGetBytesPerRow(img);
    
    同时也要分配突发事件

    outBuffer.data = malloc(inBuffer.height * inBuffer.rowBytes)
    // Setup width, height, rowbytes equal to inBuffer here
    
    现在我们创建内核,与您的示例中的内核相同,它是一个3x3矩阵 如果值是浮点值,则将其乘以一个除数(需要为int)

    现在对图像执行卷积运算

    //Use a background of transparent black as temp
    Pixel_8888 temp = 0;
    vImageConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, kernel, kernelSize.width, kernelSize.height, divisor, temp, kvImageBackgroundColorFill);
    
    现在用Exputffer构建一个新的UIImage,你的任务就完成了


    记住释放内核和突发数据。

    内核只是卷积中使用的内核。在数学术语中,矩阵与图像卷积,以实现模糊/锐化/浮雕或其他效果。您提供的这个函数只是vimage卷积函数的一个薄包装。要实际执行卷积运算,可以按照下面的代码进行。代码都是手工输入的,所以不一定100%正确,但应该指向正确的方向

    要使用此功能,首先需要对图像进行像素访问。假设您有一个UIImage,您可以执行以下操作:

    //image is a UIImage
    CGImageRef img = image.CGImage;
    CGDataProviderRef dataProvider = CGImageGetDataProvider(img); 
    CFDataRef cfData = CGDataProviderCopyData(dataProvider);
    void * dataPtr = (void*)CFDataGetBytePtr(cfData);
    
    接下来,构建将传递给函数的vImage_缓冲区

    vImage_Buffer inBuffer, outBuffer;
    inBuffer.data = dataPtr;
    inBuffer.width = CGImageGetWidth(img);
    inBuffer.height = CGImageGetHeight(img);
    inBuffer.rowBytes = CGImageGetBytesPerRow(img);
    
    同时也要分配突发事件

    outBuffer.data = malloc(inBuffer.height * inBuffer.rowBytes)
    // Setup width, height, rowbytes equal to inBuffer here
    
    现在我们创建内核,与您的示例中的内核相同,它是一个3x3矩阵 如果值是浮点值,则将其乘以一个除数(需要为int)

    现在对图像执行卷积运算

    //Use a background of transparent black as temp
    Pixel_8888 temp = 0;
    vImageConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, kernel, kernelSize.width, kernelSize.height, divisor, temp, kvImageBackgroundColorFill);
    
    现在用Exputffer构建一个新的UIImage,你的任务就完成了


    请记住释放内核和突发数据。

    正确的是,该函数非常混乱。我建议使用“提供反馈”小部件让苹果知道

    我认为应该从函数签名中删除
    kernel
    kernel\u width
    kernel\u height
    参数。这些似乎是应用调用方提供的内核的函数的保留,但本例是关于应用内部定义的内核的

    修复了
    内核
    局部变量的声明,使其成为
    uint8_t
    的数组,如下所示:

        uint8_t kernel[] = {-2, -2, 0, -2, 6, 0, 0, 0, 0}; // 1
    

    然后,在调用
    vImageConvolve_argb888()
    时,将
    内核宽度
    内核高度
    替换为
    3
    。由于内核是硬编码的,因此维度也可以是相同的。

    正确的是,该函数非常混乱。我建议使用“提供反馈”小部件让苹果知道

    我认为应该从函数签名中删除
    kernel
    kernel\u width
    kernel\u height
    参数。这些似乎是应用调用方提供的内核的函数的保留,但本例是关于应用内部定义的内核的

    修正了声明