2016-08-10 16 views
-1

OpenCVとC++の新機能です。私は、ウェブカメラでフレームをインポートし、その中の各ピクセルの値を見つけることで、リアルタイムの画像処理を行います。 次のコードは私のコードでうまくいきます。私はキーを押すたびにループから壊れて画像の最初の黒いピクセルを見つけます。しかし、私は無限ループにピクセルの最初の値を見つけるためのIf文を削除した場合、それは私にこのエラーを与える:ここでMatのOpenCV C++エラー:

OpenCV Error: Assertion failed ((unsigned)i0 < (unsigned)size.p[0]) in cv::Mat::at, file c:\opencv\build\include\opencv2\core\mat.inl.hpp, line 917>

は、私のコードの一部です:

#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/imgcodecs.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 
#include <vector> 
#include <windows.h> 

using namespace cv; 
using namespace std; 
/// Global variables 
int maxRepeating(int* arr, int n, int k); 

int main(int, char** argv) 
{ 
    Mat frame, src1; 
    Mat bgr_image; 
    Mat dst(frame.size(), CV_8UC1, cv::Scalar(0)); 
    Mat src(frame.size(), CV_8UC1, cv::Scalar(0)); 
    /// Load an image 
    VideoCapture cap(1); // open the default camera 
    if (!cap.isOpened()) // check if we succeeded 
     return -1; 
    // namedWindow("src", 1); 
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 640); 
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480); 
capturing: 
    for (;;) 
    { 
     cap >> frame; // get a new frame from camera 
     if (frame.empty()) return 0; 
     cvtColor(frame, src1, CV_BGR2GRAY); 
     imshow("src", src1); 
     if (waitKey(30) >= 0) break; //if I remove this line and put the following two lines I get the error 
// waitKey(10); 
// break; 
    } 
    int operation = 4; 
    double morph_size = 2; 
    //preprocessing 
    //... 
    Mat element = getStructuringElement(MORPH_RECT, Size(2 * morph_size + 1, 2 * morph_size + 1), Point(-1, -1)); 
    /// Apply the specified morphology operation 
    morphologyEx(src1, dst, operation, element); 
    threshold(dst, src, 128, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU); 
    int i = 0; 
    int j = 0; 
    int p = 0; 
    int q = 0; 
    int flag = 0; 
    int cnt = 0; 
    int cm = 0; 
    int flagold = 10; 
    int f0 = 1, f1 = 1, f2 = 1, f3 = 1, f4 = 1, f5 = 1, f6 = 1, f7 = 1; 
    int chain[100000]; 
    std::fill(chain, chain + size(chain), 9); 
    int val = 0; 
    for (i = 0; i < src.rows; i++) { 
     for (j = 0; j < src.cols; j++) { 
      val = src.at<uchar>(i, j); //I think problem is with this line 
      if (val == 0) { 
       cout << "fist pixel found!"; 
       cout << "i=" << i << "j=" << j << endl; 
       p = i; 
       q = j; 
       goto st; 
      } 
     } 
    } 
st: 
//some stuff... 
goto capturing; 
} 

私は感謝誰かがこの問題を取り除くことについて私を助けてくれたら。おかげさまで

+0

これは役に立ちそうです http://stackoverflow.com/questions/8112996/cvmat-causes-crash-when-assigned-to-with-atunsigned-char0-0 編集:srcは既に署名されていませんchar –

+0

それは私の問題を解決していただきありがとうございます。 –

答えて

1

私はこの問題を解決しました。私の問題は "src"マトリックスを宣言することでした。私はCV_8UC1を使用した後、CV_8Uと交換して問題を解決しました。

+0

私が正しい場合、C1は1チャンネルを表します。おそらく、あなたは '.at()'関数でチャネル引数を欠いていたでしょう。 –

+0

バイナリ行列なので、1つのチャネルにする必要があります。私はこれら2つの間で何が違うのか分かりません。 –

2

より効率的かつ正確な方法は、そのような各ピクセルにアクセスするであろう:

for(int i = 0; i < src.rows; i++) 
{ 
    const uchar* row = src.ptr<uchar>(i); 
    for(int j = 0; j < src.cols; j++) 
    { 
     if(row[j] == 0) 
      .... 
    } 
} 
+0

答えをありがとうが、この解決策は私の問題を解決しませんでした。 –

関連する問題