- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试将我的 C++ opencv 应用程序移植到 iOs,但我总是收到这个错误:
OpenCV Error: Unsupported format or combination of formats () in cvFloodFill, file /Users/user/slave/ios_framework/src/opencv/modules/imgproc/src/floodfill.cpp, line 618
libc++abi.dylib: terminate called throwing an exception
这是我的代码:
- (cv::MatND)calc_Hist
{
using namespace cv;
UIImage *temp = [UIImage imageNamed:@"file.png"];
Mat src = [self cvMatFromUIImage:temp];
Mat hsv;
Mat mask;
MatND hist;
int lo = 151; int up = 170;
cv::Point seed = cv::Point( 1029, 270 );
int newMaskVal = 255;
Scalar newVal = Scalar( 120, 120, 120 );
int connectivity = 8;
int h_bins = 30; int s_bins = 32;
int histSize[] = { h_bins, s_bins };
float h_range[] = { 0, 179 };
float s_range[] = { 0, 255 };
const float* ranges[] = { h_range, s_range };
int channels[] = { 0, 1 };
cvtColor(src, hsv, CV_BGR2HSV);
int flags = connectivity + (newMaskVal << 8 ) + cv::FLOODFILL_FIXED_RANGE + cv::FLOODFILL_MASK_ONLY;
cv::Mat mask2 = cv::Mat::zeros( src.rows + 2, src.cols + 2, CV_8UC1 );
UIImage *imgs = [self UIImageFromCVMat:hsv];
[_viewer setImage:imgs];
floodFill( src, mask2, seed, newVal, 0, cv::Scalar( lo, lo, lo ), cv::Scalar( up, up, up), flags );
mask = mask2( cv::Range( 1, mask2.rows - 1 ), cv::Range( 1, mask2.cols - 1 ) );
calcHist( &hsv, 1, channels, mask, hist, 2, histSize, ranges, true, false );
normalize( hist, hist, 0, 255, cv::NORM_MINMAX, -1, cv::Mat() );
return hist;
}
此功能在我的 Mac 上运行良好,所以我首先认为图像未正确转换,但如果我在 UIImageView 中显示图像,它会显示图像。
这里是转换方法
- (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;
}
与“正常”框架相比,iOS 框架是否有所缩减?我用谷歌搜索,但没有找到任何可以解决我的问题的方法。
最佳答案
我在 Android 上遇到了完全相同的问题。在我的案例中,“问题”是我只是将 BGRA 与 BGR 混为一谈。在我的例子中,floodfill 的输入/输出矩阵应该有 3 个 channel ,但我不小心给出了一个有 4 个 channel 的矩阵 (BGRA)。我想你也遇到了同样的问题。
它发生在我身上是因为我是从 Android OpenCV SDK 的教程代码“混合处理 2”开始的。有一个误导性的名称(第 4 个 channel 就消失了):
Mat& mRgb = *(Mat*)addrRgba;
我不得不将 4 channel 矩阵转换为 3 channel 矩阵,然后 floodfill 工作正常。
关于iOS opencv floodfill 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12785221/
我正在制作一个绘画应用程序,并且洪水填充工具可以工作,但它需要大约两分钟才能填充 400x180。我可以做什么来加快这个过程?这是我目前使用的代码。 public void gradientSize(
我必须第一次使用洪水填充算法才能解决作业中的任务。主要问题是我写的洪水填充函数的调用好像不起作用。 我的任务与此处描述的任务非常相似: How can I find hole in a 2D matr
我想填充下面张贴的图像的某个区域“左侧的矩形”。为了填充该区域,我在该矩形内指定了一个点以了解像素值,如下所示: Log.D(TAG, "", "PixVal: "+gsMat.get(100
我正在尝试在 UIImage 上进行 Floodfill 并最终使用 OpenCV 框架。我可以通过将颜色定义为 cv::Scalar(255,0,0) 来用纯色替换颜色。但是我希望填充选择是透明的。
这是一个示例代码,显示了 cv2.floodfill 函数的用法 import cv2 import numpy as np import os def imshow(img): cv2.im
我有一个包含图像的Java程序,我正在尝试使用洪水填充算法来使用以下函数(canvas)将封闭区域内的每个黑色像素替换为白色像素是一个BufferedImage): public void flood
public void floodFill(int x, int y) { if (x >= 0 && x = 0 && y = 0 && x = 0 && y <= 9) {
我的应用程序有一个静态控件,里面有一个选项卡控件。它看起来像这样: alt text http://img834.imageshack.us/img834/5645/topbar.png 我想处理顶部
我已经实现了来自 here 的连接组件识别算法,但在某些情况下,cv::floodFill(...) 似乎会填充未连接的区域。 首先,这是代码: void ImageMatchingOpenCV::g
我尝试在我的 android 应用程序上使用 floodFill 算法。我点击一个点来选择种子。然后我运行 floodfill 算法。我想显示与种子颜色相同的仅选定区域。为此,我显示 mask 垫对象
我有一个循环遍历图像并每 20 个像素进行一次填充: h, w = image.shape[:2] mask = np.zeros((h+2, w+2), np.uint8) mask[:] |= 0
下面的最小示例似乎陷入了无限循环。它运行了几分钟,然后最终因 std::bad_alloc (OpenCV 3.0) 而崩溃。 int main() { cv::Mat img( cv::Si
我被我的洪水填充算法困住了:它在“正常”不应该的时刻停止...... 情况是这样的:我有一个 512*512 像素的矩阵,值是 50 或 100 左右。值 50 形成一个正方形,我想将其更改为值 25
我正在尝试实现 floodfill。这适用于 500x500 矩阵: int ud[]={1,0,-1,0}; int lr[]={0,1,0,-1}; void fl(int x,int y) {
我正在尝试计算每组零的邻接零的数量。我使用了 floodfill 的修改版本,它返回它填充的元素数。然后我将对 floodfill 的调用放在一个循环中。我不明白这有什么问题。 正确的输出:2 4 当
我正在尝试编写我的第一个简单的扫雷游戏。为了显示空白字段,我编写了一个简单的洪水填充算法,但它没有按预期工作。这是一段代码: function reveal(a,b){ var fieldId = g
我被分配通过两种方式实现一个floodfill算法:递归a void RFloodFill(PGM *entrada, int x, int y, unsigned char corAtual, 最佳
我的任务是使用递归和 2D Ascii 图像在 Java 中编写洪水填充算法。我编写了代码并且它运行良好,但我不确定我是否可以将它写得更简单,因为我使用了太多 if 语句来检查一些东西,比如当前点在哪
我正在尝试用 Java 制作类似扫雷的游戏,并且我已经完成了其中的大部分工作。我需要帮助的是 FloodFill - http://en.wikipedia.org/wiki/Flood_fill .
我一直在使用基于堆栈的非递归变体的填充算法,它似乎完美地工作除了一个烦人的情况:如果使用一条线将图像切成两半然后floodfill 一半,它淹没了整个图像!然而,只有当我没有在图像周围放置“边框”时,
我是一名优秀的程序员,十分优秀!