c # — не может конвертировать uchar ptr в opencvsharp

Привет я использую Visual Studio 2008 и C ++ для реализации алгоритма водораздела, он работает хорошо. Но я недавно работаю над преобразованием того же кода в C # с использованием класса-оболочки opencvsharp в Visual Studio 2010. Я выполнил большую часть кода, но я не мог не конвертировать UCAR PTR в OpenCVsharp Я даже использую байтовый тип данных, но это не работает.

вот ссылка на исходный код C ++

code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/watershed.cpp?rev=493

и вот тут у меня проблема

uchar* ptr = color_tab->data.ptr + i*3;
ptr[0] = (uchar)(cvRandInt(&rng)%180 + 50);
ptr[1] = (uchar)(cvRandInt(&rng)%180 + 50);
ptr[2] = (uchar)(cvRandInt(&rng)%180 + 50);

любая помощь будет оценена. благодарю вас.

вот код C #, над которым я работал, я не могу завершить код любой помощи

using (IplImage img0 = new IplImage("1180.jpg", LoadMode.AnyDepth | LoadMode.AnyColor)){
using (IplImage img = img0.Clone())
using (IplImage marker_mask = new IplImage(img0.Size, BitDepth.U8, 1))
using (IplImage markers = new IplImage(img.Size, BitDepth.S32, 1))
using (IplImage img_gray = img0.Clone())

using (IplImage wshed = img0.Clone()){
wshed.Zero();
marker_mask.Zero();

using (CvWindow w_image = new CvWindow("image", WindowMode.AutoSize, img))
{
CvPoint prev_pt = new CvPoint(-1, -1);
w_image.OnMouseCallback += delegate(MouseEvent ev, int x, int y, MouseEvent flags)
{
if (ev == MouseEvent.LButtonUp || (flags & MouseEvent.FlagLButton) == 0)
{
prev_pt = new CvPoint(-1, -1);
}
else if (ev == MouseEvent.LButtonDown)
{
prev_pt = new CvPoint(x, y);
}
else if (ev == MouseEvent.MouseMove && (flags & MouseEvent.FlagLButton) != 0)
{
CvPoint pt = new CvPoint(x, y);
if (prev_pt.X < 0)
{
prev_pt = pt;
}

marker_mask.Line(prev_pt,pt,Cv.ScalarAll(255),5,LineType.Link8,0);
img.Line(prev_pt,pt,Cv.ScalarAll(255),5,LineType.Link8,0);
prev_pt = pt;
w_image.ShowImage(img);
}
};

for (; ; )
{
switch (CvWindow.WaitKey(0))
{
case 27:
return;
case 'r':
marker_mask.Zero();
img0.Copy(img);
w_image.ShowImage(img);
break;
case 'w':
case '\r':

CvSeq<CvPoint> contours;
CvMat color_tab=null;
int i,j,comp_count=0;

CvMemStorage storage = new CvMemStorage();
Cv.FindContours(marker_mask,storage, out contours);
markers.Zero();

for(; contours !=null; contours=contours.HNext,comp_count++){

Cv.DrawContours(markers, contours, Cv.ScalarAll(comp_count+1), Cv.ScalarAll(comp_count+1),-1,-1,LineType.Link8,new CvPoint(0,0));

}

if(comp_count ==0){
continue;

color_tab=Cv.CreateMat(1,comp_count,MatrixType.U8C3);

for(i=0;i<comp_count;i++){
/*
uchar* ptr = color_tab->data.ptr + i*3;
ptr[0] = (uchar)(cvRandInt(&rng)%180 + 50);
ptr[1] = (uchar)(cvRandInt(&rng)%180 + 50);
ptr[2] = (uchar)(cvRandInt(&rng)%180 + 50);
*/}
{
double t =(double)Cv.GetTickCount();
Cv.Watershed(img0,markers);
Cv.Save(markers,"img0.xml");
t=(double)Cv.GetTickCount()-t;
Console.WriteLine("exec time = %gms\n",t/(Cv.GetTickFrequency()*1000));
}
// paint the watershed image
for(i=0;i<markers.Height;i++)
for(j=0;i<markers.Width;j++)
{
int idx =

}
Cv.AddWeighted(wshed,0.5,img_gray,0.5,0,wshed);
Cv.ShowImage("watershed transform",wshed);
Cv.ReleaseMat(color_tab);
}}

return 0;
}}
}

спасибо Торак, но, кажется, это не работает, я изменил код C #, как это

unsafe{

CvRNG rng = new CvRNG();

byte* ptr = (byte*)color_tab.Data.ptr +i*3;

ptr[0] = (byte)(Cv.RandInt(rng)%180 + 50);
ptr[1] = (byte)(Cv.RandInt(rng)%180 + 50);
ptr[2] = (byte)(Cv.RandInt(rng)%180 + 50);

}

Это не дает никакой ошибки, но я не уверен насчет того, что я получил новую проблему. Я не могу преобразовать макрос CV_IMAGE_ELEM () в коде c ++ в c #. Может кто-нибудь помочь. Спасибо за ваши комментарии

Это где я получаю проблемы в C ++ code.full C ++ код отображается в начале вопроса

// paint the watershed image
for( i = 0; i < markers->height; i++ )
for( j = 0; j < markers->width; j++ )
{
int idx = CV_IMAGE_ELEM( markers, int, i, j );//markersIPL_DEPTH_32S
uchar* dst = &CV_IMAGE_ELEM( wshed, uchar, i, j*3 );//BGR,j*3
if( idx == -1 ) //-1?
dst[0] = dst[1] = dst[2] = (uchar)255;
else if( idx <= 0 || idx > comp_count )  //
dst[0] = dst[1] = dst[2] = (uchar)0; // should not get here
else //
{
uchar* ptr = color_tab->data.ptr + (idx-1)*3;
dst[0] = ptr[0]; dst[1] = ptr[1]; dst[2] = ptr[2];
}
}

0

Решение

После быстрого просмотра, кажется, что способ, которым вы используете данные DataArray... член color_tab, В вашем случае это было бы color_tab.DataArrayByte[...] производить что-то вроде:

for (i = 0; i < comp_count * 3; i++)
ptr[i] = (byte)(cvRandInt(...) % 180 + 50);

Я не смотрел на генерацию случайных чисел, и поэтому я не могу проверить это в данный момент, но я подозреваю, что это решает вашу проблему. Скрещенные пальцы.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]