菜鸟教程小白 发表于 2022-12-12 18:57:16

ios和opencv : how to correctly call cvtColor without wasting memory?


                                            <p><p>我在我的 ios 应用程序中使用此功能:</p>

<p><code>cv::cvtColor(image, image, cv::COLOR_BGR2RGB);</code></p>

<p>但是当我在我的 <code>- (void)processImage:(cv::Mat&)image</code> 委托(delegate)方法中调用它时,
图像在内存中消失。因此,几秒钟后,我的应用程序因内存问题而崩溃。<br/>
<strong>因内存压力而终止</strong> </p>

<p>我不只是将转换后的图像复制到以前的图像上吗?<br/>
我能做些什么来防止这种行为? </p>

<pre><code>- (void)processImage:(cv::Mat&amp;)image
{
    cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
}
</code></pre>

<p>数据在检查器中的样子的一些输出(这些 vm_allocate 行出现了很多):</p>

<p>0 0x20961000 VM:CoreAnimation 00:22.762.010 • 7,91 MB QuartzCore CA::Render::aligned_malloc(unsigned long, void**)<br/>
1 0x20178000 VM:CoreAnimation 00:22.415.490 • 7,91 MB QuartzCore CA::Render::aligned_malloc(unsigned long, void**)<br/>
2 0x2114a000 CGSImageData 00:22.762.165 • 5,95 MB CoreGraphics CGSImageDataHandleCreate<br/>
3 0x1f3a0000 VM:基础 00:22.752.743 • 5,93 MB libsystem_kernel.dylib vm_allocate<br/>
4 0x1fb89000 VM:基础 00:22.408.091 • 5,93 MB libsystem_kernel.dylib vm_allocate </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我通常可以毫无问题地转换原始图像。如果您希望保留原始图像,可以创建另一个目标垫图像。所以它是根据具体情况而定的。 </p>

<p>宁愿评论也不愿回复,但我的回答会太长。 </p>

<p>试试这个方法:
1)很有可能是由于您没有声明 channel 。比如<code>CV_8U3</code>等。</p>

<p>2)如果第一步不起作用,另一个可能性很大:尝试使用 <code>CV_BGR2RGB</code> 而不是 <code>cv::COLOR_BGR2RGB</code> (版本兼容性问题)</p>

<p>3) 你试过删除指针吗? <code>&</code></p>

<p>如果这三种方法仍然不起作用,请评论您在此答案中收到的确切错误消息。我会尽力帮助你。干杯。</p>

<p>编辑(回答您的意见):</p>

<p>当我谈论 channel 时,我的意思是 <code>CV_8U3, CV_8U</code> 等。不过你不必再尝试了,因为错误是由于 IOS 的激进内核线程设置了所有杀死所有内存不足的进程。这意味着当后台进程正在运行时,它们更有可能被“杀死”以为当前/正在运行/前台进程分配内存。</p>

<p>有关该内核的更多信息:<a href="http://newosxbook.com/articles/MemoryPressure.html" rel="noreferrer noopener nofollow">http://newosxbook.com/articles/MemoryPressure.html</a> </p>

<p>我不是 IOS 方面的专家,但我认为你可以尝试:</p>

<p>1)使用全局变量,例如将 Mat Image 设为全局而非局部</p>

<p>2) 对某些人来说有点糟糕的编程约定:跳过函数并将代码从函数转储到试图调用该函数的主/或程序。这确保了 IOS 不需要切换进程,从而杀死它们中的任何一个。</p>

<p>3) 在内核中定义应用程序配置文件(UIBackgroundMode),从而稍微驯服一下激进的内核 killer Jetsam。</p>

<p>4) 当不再需要图像时,从 RAM 中释放图像(删除对它们的引用)</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios和opencv : how to correctly call cvtColor without wasting memory?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/21864966/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/21864966/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios和opencv : how to correctly call cvtColor without wasting memory?