I think you are trying to crop the image and save the cropped portion as a new image. Below is the sample code to do that.
import cv2
import numpy as np
img = cv2.imread(r'.\dump.png', 1) # '1' read as color image
h,w = img.shape[:2]
print 'image height and width = %d x %d' % (h, w) # 318 * 348 pixels
img = img[50:250,50:280] # crop image at [h1:h2, w1:w2]
cv2.imwrite(r'.\dump_resized.png',img)
Here is cropped and saved image.

This is what you intended to do?
UPDATE:
To resize the image and put it as a picuture-in-picture one. You may resize the image first, by 1/10 for instance.
resized_image = cv2.resize(img, (h/8, w/8))
h1, w1 = resized_image.shape[:2]
Then put the resized one into the original image.
#set top left position of the resized image
pip_h = 10
pip_w = 10
img[pip_h:pip_h+h1,pip_w:pip_w+w1] = resized_image # make it PIP
cv2.imwrite(r'.\dump_pip.png',img)
Here is the resulted PIP image.

overlay a smaller image on a larger image python OpenCv - Stack Overflow
python - Copy and paste region of image in opencv? - Stack Overflow
How to paste an image in opencv python - Stack Overflow
python - How to paste 2 images of different sizes onto same background using cv2? - Stack Overflow
A simple way to achieve what you want:
import cv2
s_img = cv2.imread("smaller_image.png")
l_img = cv2.imread("larger_image.jpg")
x_offset=y_offset=50
l_img[y_offset:y_offset+s_img.shape[0], x_offset:x_offset+s_img.shape[1]] = s_img

Update
I suppose you want to take care of the alpha channel too. Here is a quick and dirty way of doing so:
s_img = cv2.imread("smaller_image.png", -1)
y1, y2 = y_offset, y_offset + s_img.shape[0]
x1, x2 = x_offset, x_offset + s_img.shape[1]
alpha_s = s_img[:, :, 3] / 255.0
alpha_l = 1.0 - alpha_s
for c in range(0, 3):
l_img[y1:y2, x1:x2, c] = (alpha_s * s_img[:, :, c] +
alpha_l * l_img[y1:y2, x1:x2, c])

Using @fireant's idea, I wrote up a function to handle overlays. This works well for any position argument (including negative positions).
def overlay_image_alpha(img, img_overlay, x, y, alpha_mask):
"""Overlay `img_overlay` onto `img` at (x, y) and blend using `alpha_mask`.
`alpha_mask` must have same HxW as `img_overlay` and values in range [0, 1].
"""
# Image ranges
y1, y2 = max(0, y), min(img.shape[0], y + img_overlay.shape[0])
x1, x2 = max(0, x), min(img.shape[1], x + img_overlay.shape[1])
# Overlay ranges
y1o, y2o = max(0, -y), min(img_overlay.shape[0], img.shape[0] - y)
x1o, x2o = max(0, -x), min(img_overlay.shape[1], img.shape[1] - x)
# Exit if nothing to do
if y1 >= y2 or x1 >= x2 or y1o >= y2o or x1o >= x2o:
return
# Blend overlay within the determined ranges
img_crop = img[y1:y2, x1:x2]
img_overlay_crop = img_overlay[y1o:y2o, x1o:x2o]
alpha = alpha_mask[y1o:y2o, x1o:x2o, np.newaxis]
alpha_inv = 1.0 - alpha
img_crop[:] = alpha * img_overlay_crop + alpha_inv * img_crop
Example usage:
import numpy as np
from PIL import Image
# Prepare inputs
x, y = 50, 0
img = np.array(Image.open("img_large.jpg"))
img_overlay_rgba = np.array(Image.open("img_small.png"))
# Perform blending
alpha_mask = img_overlay_rgba[:, :, 3] / 255.0
img_result = img[:, :, :3].copy()
img_overlay = img_overlay_rgba[:, :, :3]
overlay_image_alpha(img_result, img_overlay, x, y, alpha_mask)
# Save result
Image.fromarray(img_result).save("img_result.jpg")
Result:

If you encounter errors or unusual outputs, please ensure:
imgshould not contain an alpha channel. (e.g. If it is RGBA, convert to RGB first.)img_overlayhas the same number of channels asimg.
Your slice [349:307, 410:383] returns an empty array eye, which could not be assigned to an array view of different shape.
E.g.:
In [8]: import cv2
...: fn=r'D:\Documents\Desktop\1.jpg'
...: img=cv2.imread(fn, -1)
...: roi=img[200:400, 200:300]
In [9]: roi.shape
Out[9]: (200, 100, 3)
In [10]: img2=img.copy()
In [11]: img2[:roi.shape[0], :roi.shape[1]]=roi
In [12]: cv2.imshow('img', img)
...: cv2.imshow('roi', roi)
...: cv2.imshow('img2', img2)
...: cv2.waitKey(0)
...: cv2.destroyAllWindows()
result:
NOTE that even if roi is not an empty array, assignment with mismatching shapes will raise errors:
In [13]: img2[:100, :100]=roi
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-13-85de95cf3ded> in <module>()
----> 1 img2[:100, :100]=roi
ValueError: could not broadcast input array from shape (200,100,3) into shape (100,100,3)
I would guess that there's something off with your image. Let's look at the error returned
ValueError: could not broadcast input array from shape (0,0,3) into shape (150,165,3)
So eye appears to have the dimension (0,0,3) and img has the dimension (150,165,3). The 3 corresponds to RGB which is the 3 different color channels. So your original image is 150x165. But you tried to select a region at img[349:307, 410:383]. I suspect since the region you specified is outside the image it is not selecting anything hence the dimensions (0,0,3).
Try import pdb; pdb.set_trace() after the second line where you initialize eye. This will pop you into an interactive python terminal where you can see what's going on. Try to see what the dimensions of img are and if it's really what you want. Maybe the image you downloaded is smaller than the example causing the error.
Check out the first answer to a similar question. Your method for getting roi looks correct so try just adjusting the coordinates to a smaller region that fits.
Abid Rahman K's answer is correct, but you say that you are using cv2 which inherently uses NumPy arrays. So, to make a complete different copy of say "myImage":
newImage = myImage.copy()
The above is enough. There isn't any need to import NumPy (numpy).
If you use cv2, the correct method is to use the .copy() method in NumPy. It will create a copy of the array you need. Otherwise it will produce only a view of that object.
For example:
In [1]: import numpy as np
In [2]: x = np.arange(10*10).reshape((10, 10))
In [4]: y = x[3:7, 3:7].copy()
In [6]: y[2, 2] = 1000
In [8]: 1000 in x
Out[8]: False # See, 1000 in y doesn't change values in x, the parent array.